我想确保我的应用程序的特定号码都没有任何分隔符印,分组等。不管当前的环境是什么。 看来,以下两种方法产生相同的结果(也有可能更多):
123456789.ToString("0");
123456789.ToString(CultureInfo.InvariantCulture);
你知道的任何边缘案件或怪癖? 哪一个更“正确”? 你会用哪一个?
我以前用的第二个,但最近我发现的第一个和使用它,因为它不需要额外的开始using System.Globalization
。
我想确保我的应用程序的特定号码都没有任何分隔符印,分组等。不管当前的环境是什么。 看来,以下两种方法产生相同的结果(也有可能更多):
123456789.ToString("0");
123456789.ToString(CultureInfo.InvariantCulture);
你知道的任何边缘案件或怪癖? 哪一个更“正确”? 你会用哪一个?
我以前用的第二个,但最近我发现的第一个和使用它,因为它不需要额外的开始using System.Globalization
。
基于问题的答案,这里的讨论,我做了一些更多的研究。 以下是我发现:
当您使用12345678.ToString()
不带任何参数,.NET使用一般的通用格式说明仅由NumberFormatInfo.NegativeSign,受影响的NumberFormatInfo“G”。 NumberDecimalSeparator,NumberFormatInfo.NumberDecimalDigits和NumberFormatInfo.PositiveSign。 对我来说,这是说在任何文化12345678.ToString()
应该总是产生“12345678”。
如果你想单独的数字 ,你需要使用数字格式说明“N”(或者,当然要提供一个自定义格式字符串)。 数字分组也适用于“C”和“P”。
固定区域性确实指定数字分组 (由3个数字,当然)和数字分隔。 所以原因123456789.ToString(CultureInfo.InvariantCulture)
生产的“123456789”,是因为固定区域性的不是,但它是因为默认的通用数值格式说明“G”的。
所以,我要说的是,结论是,这是完全OK 不担心任何额外的参数,只需使用 :
12345678.ToString()
我认为,这从所有的情况下最好的,因为这意味着通常你不需要甚至调用ToString()
,因为大多数的打印/写功能接受各种参数和做ToString()
为您服务。
这两种方法是不等价的:第一是使用的CurrentCulture。 这可能会导致某些文化额外的点/逗号(我没有例子)。
当您使用InvariantCulture的你一定总是相同的格式被使用。
编辑:而且,如果你使用CodeAnalysis,会抱怨,当你不使用的CultureInfo。
在我看来,第一个将格式与使用计算机的默认区域性至少一个字符的数字。 第二个将其格式化为取决于InvariantCulture的规则数。
鲍比
(〜5年后...)
我一直在寻找了这个确切的问题,但由于没有公认的答案和即使扬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片段
2号线做不同的事情。 第一行格式化与本地文化的数量,第二个将其转换成字符串不带格式,但使用CultureInfo.InvariantCulture。
您可以使用CultureInfo.InvariantCulture用这种方法(的ToString,ToLower将...),以确保当值所使用的任何软件(数据库,另一个库...),无论他们的文化是什么,它会导致相同的值时,他们可以拿起这个值,他们可以继续处理它。 但是,如果你不使用这个其它软件必须弄清楚你的文化是什么。 您的意思是用逗号或别的东西小数点分隔符......?
所有并全部采用CultureInfo.InvariantCulture当你想中间库,数据库交换/使用价值和使用CultureInfo.CurrentCulture展现给你的应用程序的用户。
// for softwares
string mystring1 = 1234.ToString("0", CultureInfo.InvariantCulture);
// for your application users
string mystring2 = 1234.ToString("0", CultureInfo.CurrentCulture);
该的ToString()和的ToString(CultureInfo.InvariantCulture)总是给出整数相同的结果。
下面的代码给出了“809个文化测试,0分歧找到 ”我的电脑上的结果:
var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures).ToArray();
var numbers = new[] { 0, -1, 1, int.MinValue, int.MaxValue };
var diffsFound = 0;
foreach (var culture in cultures)
{
foreach (var number in numbers)
{
var s1 = number.ToString();
var s2 = number.ToString(culture);
if (s1 != s2)
{
Console.WriteLine($"{culture.DisplayName}: {s1} != {s2}");
diffsFound++;
}
}
}
Console.WriteLine($"{cultures.Length} cultures tested, {diffsFound} differences found.");
如果你想确保指定“无格式,不管是什么”我个人认为第一个选项,您有:
123456789.ToString("0");
更好的通信的意图。 缺点是,如果一种文化推翻的“0”格式字符串为您所使用的数字类型。