这两天把程序交给俄罗斯的客户试用时,出现了奇怪的问题,查询后发现程序生成的文件里面格式化好的字符窜的小数点都变成了英文逗号,;搜索了下发现有些欧洲小国家的小数点是有逗号表示的,.net在格式化时候会根据系统的设置生成。

string.format("{0:f2}",3.1415); //3,14

如果想要将系统的小数掉用点号表示,可以用下面代码:

private static void SetInternation()
        {
            RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Control Panel\International", true);
            if (rk.GetValue("sDecimal").ToString() != ".")
            {
                rk.SetValue("Locale", "00000409");
                rk.SetValue("LocaleName", "en-US");
                rk.SetValue("sCountry", "United States");
                rk.SetValue("sCurrency", "$");
                rk.SetValue("sDecimal", ".");
                rk.SetValue("sList", ",");
                rk.SetValue("sLongDate", "dddd, MMMM d, yyyy");
                rk.SetValue("sMonDecimalSep", ".");
                rk.SetValue("sMonThousandSep", ",");
                rk.SetValue("sThousand", ",");
                rk.SetValue("sTimeFormat", "h:mm:ss tt");
                rk.SetValue("sShortTime", "h:mm tt");
                rk.SetValue("iCountry", "1");
                rk.SetValue("iCurrDigits", "2");
                rk.SetValue("iFirstDayOfWeek", "6");
                rk.SetValue("iTime", "0");
                rk.SetValue("iTLZero", "0");

                Process p = new Process();
                p.StartInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                p.StartInfo.UseShellExecute = false;
                p.Start();
                //退出  
                System.Windows.Forms.Application.Exit();
            }

            rk.Close();
        }

原理就是修改注册表将系统的小数位数表示用.号表示。设置之后需要重新启动程序。