我想确保在我的应用程序中打印的某些数字没有任何分隔符,分组等,无论当前环境是什么。以下两种方法似乎产生了相同的结果(可能还有更多):
123456789.ToString("0");
123456789.ToString(CultureInfo.InvariantCulture);你有没有注意到任何边缘情况或怪癖?哪一个更“正确”?你会用哪一个?
我曾经使用第二个,但最近我找到了第一个,并开始使用它,因为它不需要额外的using System.Globalization。
发布于 2009-09-29 09:44:42
基于这里的答案和讨论,我做了更多的调查。这是我发现的:
12345678.ToString()时,.NET使用通用的通用格式说明符"G",它只受NumberFormatInfo.NegativeSign、NumberFormatInfo的影响。NumberDecimalSeparator、NumberFormatInfo.NumberDecimalDigits和NumberFormatInfo.PositiveSign。对我来说,这意味着在任何文化中,12345678.ToString()都应该始终生成“12345678”。123456789.ToString(CultureInfo.InvariantCulture)生成"123456789“的原因不是因为不变的区域性,而是因为默认的通用数字格式说明符”G“。所以我要说的结论是,这是完全可以的,不用担心会有任何额外的参数,只需使用
12345678.ToString()我认为这是所有情况中最好的,因为这意味着通常您甚至不需要调用ToString(),因为大多数打印/写入函数接受各种参数并为您执行ToString()。
发布于 2009-09-28 15:07:49
这两种方法并不等价:第一种是使用CurrentCulture。在某些区域性中,这可能会导致额外的点/逗号(我没有示例)。
当您使用InvariantCulture时,您可以确定始终使用相同的格式。
编辑:而且,如果你使用CodeAnalysis,当你不使用CultureInfo时就会抱怨。
发布于 2015-02-10 00:36:16
(大约5年后...)
我正在查找这个确切的问题,但是由于没有公认的答案,即使Jan Zich是正确的,我想我应该放一个小例子来测试这个问题。
我还要说,.ToString()、.ToString("0")和.ToString(任何文化信息)(就整数和小数而言)之间没有区别。
var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures)
.Except(CultureInfo.GetCultures(CultureTypes.SpecificCultures));
foreach(var c in cultures){
var num = (int.MinValue);/*
var num = (int.MaxValue);/*
var num = (decimal.MinValue);/*
var num = (decimal.MaxValue);/*
--*/
var s1 = num.ToString("0") ;
var s2 = num.ToString(c);
if(s1 != s2){
var s = string.Format("{2}: {0} {1}",s1,s2,c);
s.Dump();
}
}LinqPad snippet
https://stackoverflow.com/questions/1487532
复制相似问题