ToString(“0”)与ToString(CultureInfo.InvariantCulture)

时间:2009-09-28 15:00:00

标签: .net globalization cultureinfo

我想确保我的应用程序中的某些数字在没有任何分隔符,分组等的情况下打印,无论当前环境如何。似乎以下两种方法产生相同的结果(可能更多):

123456789.ToString("0");
123456789.ToString(CultureInfo.InvariantCulture);

您是否知道任何边缘情况或怪癖?哪一个更“正确”?你会用哪一个?

我曾经使用过第二个,但最近我找到了第一个并开始使用它,因为它不需要额外的using System.Globalization

7 个答案:

答案 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();
    }
}

LinqPad snippet

答案 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”。