我在这里有点困惑。
我应该使用什么?
Console.WriteLine((val/1085).ToString("N"));
VS
Console.WriteLine(String.Format("{0:N}", (val/1085)));
也,我如何适应InvariantCulture?有什么最佳实践吗?:)
我在这里有点困惑。
我应该使用什么?
Console.WriteLine((val/1085).ToString("N"));
VS
Console.WriteLine(String.Format("{0:N}", (val/1085)));
实际上,我更喜欢第三种形式:
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
看起来很奇怪。
对于格式和文化,我更喜欢以下方式:
.ToString("####0.00",CultureInfo.InvariantCulture)
.ToString("N",CultureInfo.InvariantCulture)
.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
始终使用不受区域设置影响的不变区域设置,即英文数值格式。
注意:特别针对日期格式化,我提供了一个不同的扩展方法,你可以在这里找到。
.ToString()
,但问题是在询问.ToString("N")
。您的字符串插值应该像这样:$"{obj:N}"
。(也许您想将格式“N”作为参数传递。) - intrepidis