C#.NET和sprintf语法

23

这段代码如何转换成C#,特别是如何在C#中实现sprintf

string output = "The user %s logged in";
string loggedIn = "is";
string loggedOut = "isn't";

if (TheUser.CheckStatus())
{
    output = sprintf(output, loggedIn);
}
else
{
    output = sprintf(output, loggedOut);
}

return output;

我希望看到的是,如果TheUser.CheckStatus()false,则显示"用户未登录"
6个回答

27

请查看string.Format相关内容,以下是使用该方法编写的代码:

string output = "The user {0} logged in";
string loggedIn = "is";
string loggedOut = "isn't";

if (TheUser.CheckStatus())
{
    output = string.Format(output, loggedIn);
}
else
{
    output = string.Format(output, loggedOut);
}

return output;

更简单地说,可以使用三元表达式:
string output = "The user {0} logged in";

return TheUser.CheckStatus() 
    ? string.Format(output, "is")
    : string.Format(output, "isn't");

2
作为单行代码:return string.Format("用户{0}已登录", TheUser.CheckStatus() ? "是" : "否"); - Stormenet

6

C语言中的整个printf函数族被String.Format替代。例如Console.WriteLine()中也暴露了相同的接口。

 string output = "The user {0} logged in";
 string loggedIn = "is";
 string loggedOut = "isn't";


 output = string.Format(output, loggedIn);

4
如果您想继续使用 %s,%d…… 的格式,可以使用以下方法:

string sprintf(string input,params object[] inpVars)
{
    int i=0;
    input=Regex.Replace(input,"%.",m=>("{"+ i++/*increase have to be on right side*/ +"}"));
    return string.Format(input,inpVars);
}

现在你可以执行以下操作:
sprintf("hello %s..Hi %d","foofoo",455);

谢谢提供另一种选择。很好知道! - Jimmyt1988
1
我需要这个:),谢谢。同时不要忘记包含 using System.Text.RegularExpressions; - Sourav
@semoLi在编辑中建议应该是input=Regex.Replace(input,"%.",m=>("{"+ i++/*增加必须在右侧*/ +"}"));。看起来是正确的,可以参考https://dotnetfiddle.net/1fvvqD和https://dotnetfiddle.net/nu0dBY进行比较。 - dbc

4

使用C# 6,您可以使用可格式化字符串:

if (TheUser.CheckStatus())
{
    output = $"The user {loggedIn} logged in"
}

{loggedIn} 是你定义的变量名称。在字符串内使用它。

此外,你可以在花括号内使用智能感知来选择变量名。


有没有可能“加载”这样的字符串?例如,从其他地方获取字符串,然后在代码中以某种方式使用它? - htmlcoderexe

3

string.Format 真是个好东西

string output = "The user {0} logged in";
string loggedIn = "is";
string loggedOut = "isn't";

output = (TheUser.CheckStatus() ? string.Format(output, loggedIn) : 
                                  string.Format(output, loggedOut));
return output;

请参阅有关“复合格式”(composite formatting)的基础文章:链接 编辑:简短版本
return string.Format(output, (TheUser.CheckStatus() ? loggedIn : loggedOut));

sprintf...听我的话,否则我会让你负责换尿布!! - Jimmyt1988
喜欢简写的if语句。也感谢你提供了这种语法 :) - Jimmyt1988
@JamesT 是的,非常有用,让它更短了。 - Steve

0

Anirudha已经写了解决方案,但我无法添加评论,所以我将其发布为答案。它需要是int i=-1;,否则它会抛出异常。

string sprintf(string input,params object[] inpVars)
{
    int i=-1;
    input=Regex.Replace(input,"%.",m=>("{"+ ++i +"}"));
    return string.Format(input,inpVars);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接