是Int32.ToString()文化特定?

我正在运行ReSharper的testing版本,它给我警告以下代码:

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

警告是在id.ToString()调用,它告诉我“明确指定string转换文化”。 我理解这个警告,并且我知道如何解决它 – 只需将代码更改为非常笨拙的id.ToString(CultureInfo.InvariantCulture)

但我的问题是:这是必要的吗? 我的意思是,当你使用DateTime (不同的文化有不同的date格式)和Double (不同的字符用于小数点)时,指定文化是很重要的。 但是Int32.ToString() ,至less在en-US和不变的文化中,根本不会添加任何格式。 没有逗号,没有小数点,没有美元符号,什么都没有。 那么文化会有什么不同呢?

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

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

 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 = "!"; 

按照随机样本整数进行testing,所有安装了Windows( CultureTypes.InstalledWin32Cultures )的文化CultureTypes.InstalledWin32Cultures得到相同的结果。

丹尼尔是正确的注意到一个自定义文化可以使用不同的前缀负数,但我怀疑有人曾经使用过这个function,除了意外。

我猜.NET开发人员是否与float和其他types一致。 他们还期待什么?

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

是。 这取决于当前的文化。 从MSDN文档 :

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

强调我的

Resharper很可能希望你明确你打算使用的文化。 由于省略它依赖于在不同机器上执行时可能会改变的行为。

有点奇怪; 我希望50.ToString(CultureInfo.CreateSpecificCulture(“AR-AE”))返回“50”,但它不。

我只是看了这个问题,似乎是NumberFormatInfo.DigitSubstitution 实际上并没有实现

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

所以,虽然有一个枚举System.Globalization.DigitShapes,它实际上并没有在IFormatProvider的NumberFormatInfo位实现。

我会说没有,但在检查MSDN Int32.ToString()有这样的:

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

所以有一个惊喜。

这个问题应该是为什么目前的Resharper没有提出这个build议?

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

在一些国家 ,他们会使用小数或空格代替逗号。