String.Format和ToString以及使用InvariantCulture 在C#中,我们经常需要将数据转换为字符串。有两种常见的方法可以实现这一点:String.Format和ToString。 String.Format是一个非常强大的方法,它允许我们使用占位符来格式化字符串。我们可以在占位符中指定要插入的值,并定义其格式。例如: int age = 25; string name = "John"; string formattedString = String.Format("My name is {0} and I am {1} years old.", name, age); 在上面的例子中,{0}和{1}是占位符,分别对应name和age变量的值。通过使用String.Format,我们可以轻松地将变量的值插入到字符串中。 另一方面,ToString是每个对象都具有的方法,它用于将对象转换为字符串。默认情况下,ToString方法返回对象的完全限定类型名。但是,我们可以重写ToString方法,以便返回我们想要的任何字符串表示形式。 当我们只需要将一个简单的值转换为字符串时,ToString是更简单的选择。例如: int number = 10; string numberString = number.ToString(); 在上面的例子中,我们只需将整数值转换为字符串,所以使用ToString方法就足够了。 最后,使用InvariantCulture是在进行字符串格式化时的一个重要注意事项。在不同的文化环境中,数字、日期和货币的格式可能会有所不同。如果我们希望确保在不同的文化环境中得到一致的结果,我们应该使用InvariantCulture。例如: double amount = 10.5; string formattedAmount = amount.ToString(CultureInfo.InvariantCulture); 在上面的例子中,我们使用InvariantCulture来格式化amount变量的值,以确保在任何文化环境中都得到相同的结果。 总之,String.Format和ToString是将数据转换为字符串的两种常见方法。String.Format提供了更灵活的格式化选项,而ToString则更适合简单的转换。在进行字符串格式化时,使用InvariantCulture可以确保在不同的文化环境中得到一致的结果。

20

我在这里有点困惑。

我应该使用什么?

Console.WriteLine((val/1085).ToString("N"));

VS

Console.WriteLine(String.Format("{0:N}", (val/1085)));

也,我如何适应InvariantCulture?有什么最佳实践吗?:)
4个回答

31

实际上,我更喜欢第三种形式:

Console.WriteLine("{0:N}", val / 1085);

Console.WriteLine 可以为您执行 String.Format

Console.WriteLine 不允许您提供文化信息。如果这是您想要的,您仍需要使用 String.Format。例如:

String.Format(CultureInfo.InvariantCulture, "{0:N}", 123456789);

我不建议使用那种格式,因为国际用户可能会阅读有困难。对我而言,123,456,789.00 看起来很奇怪。


1
在哪里我适合使用InvariantCulture?对于像34345435这样的数字,如何获得输出34,345,435? - Joe
1
我只想将34345435表示为34,345,435。 - Joe

4

对于格式和文化,我更喜欢以下方式:

 .ToString("####0.00",CultureInfo.InvariantCulture)

或者
.ToString("N",CultureInfo.InvariantCulture)

4
我找到了一种不变且通用的解决方法。
语法:
.ToStringInvariant(format)
.ToStringInvariant() 

从技术上讲,这是一个通用的扩展方法,定义如下:

public static class Extensions
{
    private static IFormatProvider inv 
                   = System.Globalization.CultureInfo.InvariantCulture.NumberFormat;

    public static string ToStringInvariant<T>(this T obj, string format=null)
    {
        return (format == null) ? System.FormattableString.Invariant($"{obj}") 
                                : String.Format(inv, $"{{0:{format}}}", obj);
    }
}

使用方法很简单,只需使用.ToStringInvariant()而不是.ToString()。优点是它适用于任何数据类型。
可选地,您还可以传递一个格式,例如.ToStringInvariant("N"),就像您习惯使用.ToString("N")一样。 请注意,在这种情况下,扩展方法在内部使用String.Format。
如果您的数字格式有不同的文化设置,例如在德国我们使用逗号代替小数点。这意味着在具有德国文化设置的计算机上,您会看到不同的结果:
void Main()
{
    var val = 2456.5;
    Console.WriteLine((val/1085).ToString("N"));
    Console.WriteLine((val/1085).ToStringInvariant("N"));
    Console.WriteLine((val/1085).ToStringInvariant("0.000"));
    Console.WriteLine((val/1085).ToStringInvariant());
}

它会输出:

2.26
2.26
2.264
2.26405529953917

这是正确的,因为.ToString使用当前区域设置(德国设置),而.ToStringInvariant始终使用不受区域设置影响的不变区域设置,即英文数值格式。

注意:特别针对日期格式化,我提供了一个不同的扩展方法,你可以在这里找到。


更多信息: FormattableString.Invariant(FormattableString) 方法


这相当于使用.ToString(),但问题是在询问.ToString("N")。您的字符串插值应该像这样:$"{obj:N}"。(也许您想将格式“N”作为参数传递。) - intrepidis
@intrepidis - 很好的建议,我已经改进了扩展方法,现在你也可以这样做。 - Matt

1
在日期时间中两种方式都可以使用。我更喜欢并且看到第一种解决方案(当然缺少括号)。
当您有一些包含某些参数间隙的字符串时,String.Format方法就非常有用了。这是一个强大的方法,可以帮助您很好地组织代码。

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