Localization 为什么en ZA的数字分组和小数分隔符从.NET 3.5更改为.NET 4.0?

Localization 为什么en ZA的数字分组和小数分隔符从.NET 3.5更改为.NET 4.0?,localization,.net-4.0,locale,decimal-point,Localization,.net 4.0,Locale,Decimal Point,我们的系统中有代码,可以根据用户选择的区域设置设置数字和货币的格式。我们的一位用户选择了Enza,并注意到随着我们迁移到.NET 4.0,数字分组和小数分隔符发生了变化 我编写了一段代码来说明这一变化: using System; namespace regional { class Program { static void Main(string[] args) { var ci = new System.Globali

我们的系统中有代码,可以根据用户选择的区域设置设置数字和货币的格式。我们的一位用户选择了Enza,并注意到随着我们迁移到.NET 4.0,数字分组和小数分隔符发生了变化

我编写了一段代码来说明这一变化:

using System;
namespace regional
{
    class Program
    {
        static void Main(string[] args)
        {
            var ci = new System.Globalization.CultureInfo("en-ZA");
            var output = 1234567.00m.ToString("c", ci);
            Console.WriteLine(output);            
        }
    }
}
在.NET 3.5下,我们得到如下输出:

R 1,234,567.00
R 1 234 567,00
在.NET 4.0下,我们得到如下输出:

R 1,234,567.00
R 1 234 567,00
是什么导致了.NET 3.5和.NET 4.0之间十进制分隔符和数字分组的变化


根据维基百科,“当南非采用公制时,它采用逗号作为十进制分隔符。”这意味着这个设置在某个点上发生了变化,但是我仍然不清楚为什么不同的框架版本之间的行为不同。

基于消费者反馈,.net团队审查了类似的内容-大概有足够多的人请求他们说现有设置不正确,所以他们更改了这些设置

基本上说“我们在版本之间更新全球化设置”,并且

他说,从Windows7开始,他们实际上从操作系统加载全球化数据(因此,在不同的操作系统下,在不同的时间点,en-za可能会出现不同)。也

由于世界日新月异,全球化信息随时都会发生变化;开发人员不应该期望全球化属性的值在不同版本之间保持不变,甚至对于同一版本的.NET Framework也是如此


除了Tom在回答中所说的之外:如果你的代码因为这个问题而中断,那么你首先就做错了。传递值时应始终使用正确的数据类型,解析用户输入的字符串时应始终考虑当前线程文化-如果这样做,本地化的更改将仅在用户端看到,而不会在其他地方看到。本地化的更改仅在用户端看到。在这种情况下,用户认为更改不正确。我的问题中是否有什么东西使它看起来像是在用户端以外的其他地方被看到的?简单的回答是.NET3.5版本是错误的。规定的格式是空格表示分组,逗号表示十进制符号。大多数人不使用规定的格式(例如Excel),使用句点表示十进制符号,但这与此无关。NET 4.0版本反映了官方规定的格式。谢谢您的回答。我的猜测是,如果某个特定客户想要一套不同的格式规则,而这些规则在en-ZA中不再可用,那么我必须找出如何支持自定义CultureInfo。看起来是这样的,即使他们只是想要一套一致的格式规则,你也可能不得不这么做——我们都可能只需要一次windows更新就可以更改这些设置(从Win7开始)!南非主要是一个以时期为基础的文化,因此不幸的是,这一进程肯定在某个地方“打嗝”