Int32.ToString()是否特定于文化?

时间:2011-12-13 16:18:55

标签: c# .net resharper cultureinfo

我正在运行ReSharper的测试版,并且它给了我以下代码的警告:

int id;
// ...
DoSomethingWith(id.ToString());

警告在id.ToString()调用上,它告诉我“明确指定字符串转换中的文化”。我理解这个警告,而且我知道如何修复它 - 只需将代码更改为更加笨拙的id.ToString(CultureInfo.InvariantCulture)

但我的问题是:那有必要吗?我的意思是,当您使用类似DateTime(不同文化具有不同日期格式)和Double(用于小数点的不同字符)等类型时,显然指定文化非常重要。但Int32.ToString(),至少在en-US和invariant文化中,根本不添加任何格式。没有逗号,没有小数点,没有美元符号,没有。那么文化会有什么不同呢?

当您调用无参数Int32.ToString()时,是否有一些文化实际上添加某种格式?或者这是ReSharper测试版中的错误,这个警告真的不适用于Int32(在这种情况下我会提交ReSharper错误报告)?

7 个答案:

答案 0 :(得分:60)

操作系统允许更改数字的负号

Control panel -> 
   Language and regional settings -> 
         Additional settings -> 
             Negative sign

因此,目前的文化可能已经超越了负号。在这种情况下,您需要尊重区域设置,这是警告的原因。您还可以以编程方式更改负号:

    CultureInfo culture = Thread.CurrentThread.CurrentCulture;
    // Make a writable clone
    culture = (CultureInfo) culture.Clone();
    culture.NumberFormat.NegativeSign = "!";

答案 1 :(得分:22)

在随机抽样样本上测试时,安装了Windows(CultureTypes.InstalledWin32Cultures)的所有352个文化结果都给出了相同的结果。

丹尼尔注意到自定义文化可以使用不同的前缀来表示负数,但我怀疑是否有人曾经偶然使用过此功能。

我猜.NET开发者认为它与float和其他类型一致。他们还有什么期待?

> int.MaxValue.ToString(CultureInfo.AncientRome)
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....

答案 2 :(得分:3)

是。这取决于当前的文化。来自MSDN docs

  

返回值的格式为通用数字格式说明符(“G”)和当前文化的NumberFormatInfo对象

强调我的

Resharper最有可能希望您明确表达您打算使用的文化。因为省略它依赖于在不同机器上执行时可能会改变的行为。

答案 3 :(得分:2)

这很奇怪;我原以为50.ToString(CultureInfo.CreateSpecificCulture(“ar-AE”))返回“50”,但事实并非如此。

我刚看了这个,问题似乎是NumberFormatInfo.DigitSubstitution isn't actually implemented

  

DigitSubstitution属性保留供将来使用。目前,它不用于当前NumberFormatInfo对象的解析或格式化操作。

因此,尽管存在枚举System.Globalization.DigitShapes,但它实际上并未在IFormatProvider的NumberFormatInfo位中实现。

答案 4 :(得分:0)

我会说不,但在检查MSDN Int32.ToString()时就是这样:

  

使用通用数字格式说明符(“G”)和当前区域性的NumberFormatInfo对象格式化返回值。

所以有一个惊喜。

问题应该是为什么目前的Resharper不会这样做?

答案 5 :(得分:-1)

编译器正在(不必要地)警告我们有关它可能以某种方式强制转换为字符串,而不是我们期望的那样。例如:

int i = 1;
Console.WriteLine("i.ToString='{0}'", i.ToString());

我们都希望它返回为'1',但不能保证100%,因为.ToString()方法受到当前线程区域性的影响。它声称它可能会返回“ 1.00”或类似的结果,但是我用一个非常小的代码对其进行了测试:

foreach(CultureInfo ci In System.Globalization.CultureInfo.GetCultures(CultureTypes.AllCultures) {
        Console.WriteLine("RESULT='{0}' CultureCode: {1} EnglishName:{2}", i.ToString(ci), ci.Name, ci.EnglishName);
        if (!i.ToString(ci).Equals("1"))
            throw new FormatException()
}

该代码从未返回任何错误。因此,它实际上永远不会返回“ 1”以外的任何东西。

在这个世界上,有一个新国家会使用一种全新的本机超级怪兽语言,实际上将整数拼写为“ 1.00”,我们可以毫无疑问地继续使用.ToString()。

干杯!

输出为:

答案 6 :(得分:-4)

因为整数可以高达2,147,483,647。

some countries中,他们会使用小数或空格代替逗号。