Is Int32.ToString() culture-specific?

只谈情不闲聊 提交于 2019-11-27 04:43:58

The Operating System allows to change the negative sign for numbers.

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

So, current culture could have overridden the negative sign. In this case you need to respect the regional settings, this is the reason of the warning. You can also change the negative sign programatically:

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

As tested on a random sample of ints, all 352 cultures installed with Windows (CultureTypes.InstalledWin32Cultures) give identical results.

Daniel is right to note a custom culture could use a different prefix for negative numbers, but I doubt anyone has ever used this feature save by accident.

I guess the .NET devs did it to be consistent with float and other types. What else were they expecting?

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

Yes. It depends on the current culture. From the MSDN docs:

The return value is formatted with the general numeric format specifier ("G") and the NumberFormatInfo object for the current culture.

emphasis mine

Resharper just most likely wants you to be explicit about what culture you are intending to use. Since omitting it relies on behavior that may change when executed on different machines.

It's weird; I would have expected 50.ToString(CultureInfo.CreateSpecificCulture("ar-AE")) to return "٥٠", but it doesn't.

I've just looked this up, and the problem seems to be that NumberFormatInfo.DigitSubstitution isn't actually implemented

The DigitSubstitution property is reserved for future use. Currently, it is not used in either parsing or formatting operations for the current NumberFormatInfo object.

So, although there is an enumeration System.Globalization.DigitShapes, it's not actually implemented in the NumberFormatInfo bit of IFormatProvider.

I would have said no, but on checking MSDN Int32.ToString() there's this:

The return value is formatted with the general numeric format specifier ("G") and the NumberFormatInfo object for the current culture.

So there's a surprise.

The question should be why doesn't the current Resharper suggest this?

Because integers can be be as high as 2,147,483,647.

In some countries, they would use decimals or a space in place of the commas.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!