我想确保我的应用程序中的某些数字在没有任何分隔符,分组等的情况下打印,无论当前环境如何。似乎以下两种方法产生相同的结果(可能更多):
123456789.ToString("0");
123456789.ToString(CultureInfo.InvariantCulture);
您是否知道任何边缘情况或怪癖?哪一个更“正确”?你会用哪一个?
我曾经使用过第二个,但最近我找到了第一个并开始使用它,因为它不需要额外的using System.Globalization
。
答案 0 :(得分:20)
根据这里的答案和讨论,我做了一些调查。这是我发现的:
当您使用不带任何参数的12345678.ToString()
时,.NET会使用通用格式说明符“G”,它仅受NumberFormatInfo.NegativeSign,NumberFormatInfo的影响。 NumberDecimalSeparator,NumberFormatInfo.NumberDecimalDigits和NumberFormatInfo.PositiveSign。对我而言,这表明在任何文化12345678.ToString()
都应该始终生成“12345678”。
如果您想分开数字,则需要使用数字格式说明符“N”(或者,当然,还要提供自定义格式字符串)。数字分组也适用于“C”和“P”。
不变文化确实确实指定了数字分组(当然是3位数)和数字分隔符。因此123456789.ToString(CultureInfo.InvariantCulture)
产生“123456789”的原因不是因为文化不变,而是因为默认的通用数字格式说明符“G”。
所以我会说结论是不要担心关于任何额外的论据并且只是使用:
12345678.ToString()
我认为这是所有案例中最好的,因为这意味着通常你甚至不需要调用ToString()
,因为大多数打印/写入函数接受各种参数并执行{{1}为了你。
答案 1 :(得分:6)
这两种方法不相同:第一种方法是使用CurrentCulture。这可能会导致某些文化中出现额外的点/逗号(我没有例子)。
使用InvariantCulture时,您确定始终使用相同的格式。
编辑:并且,如果您使用CodeAnalysis,那么当您不使用CultureInfo时会抱怨。
答案 2 :(得分:2)
正如我所看到的,第一个将格式化的是一个至少有一个字符的数字,使用计算机的默认文化。 第二个将根据InvariantCulture规则将其格式化为数字。
巴比
答案 3 :(得分:2)
(约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();
}
}
答案 4 :(得分:1)
2行做不同的事情。第一行使用本地文化格式化数字,第二行将其转换为字符串而不使用格式化但使用CultureInfo.InvariantCulture。
您将CultureInfo.InvariantCulture与这种方法(ToString,ToLower ...)一起使用,以确保当任何软件(数据库,另一个库......)使用该值时,无论他们的文化是什么,它将产生相同的值,当他们可以获取此值时,他们可以继续处理它。但是,如果你不使用它,其他软件必须弄清楚你的文化是什么。你的意思是小写分隔符用逗号或别的东西......?
当您想要在库,数据库之间交换/使用值并使用CultureInfo.CurrentCulture向您的应用程序的用户显示时,所有和所有人都使用CultureInfo.InvariantCulture。
// for softwares
string mystring1 = 1234.ToString("0", CultureInfo.InvariantCulture);
// for your application users
string mystring2 = 1234.ToString("0", CultureInfo.CurrentCulture);
答案 5 :(得分:1)
.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.");
答案 6 :(得分:0)
如果您想确保指定“无格式,无论什么”,我个人认为您拥有第一个选项:
123456789.ToString("0");
更好地传达意图。缺点是如果文化覆盖了您正在使用的数字类型的格式字符串“0”。