【问题标题】:CultureInfo and Double.parse and double.toString not worked correctlyCultureInfo 和 Double.parse 和 double.toString 无法正常工作
【发布时间】:2017-07-03 06:29:40
【问题描述】:

如何强制 c# 应用程序使用 .用于小数分隔符并忽略服务器中的文化设置。我对 double.ToString 和 double.parse 有这个问题 由于应用规模大,我应该更改应用级别的设置。

在 double.parse("1/25") 和 1.25 ToString 等情况下会发生异常

我有试试这个代码

string CultureName = Thread.CurrentThread.CurrentCulture.Name;
        CultureInfo ci = new CultureInfo(CultureName);
        if (ci.NumberFormat.NumberDecimalSeparator != ".")
        {
            // Forcing use of decimal separator for numerical values
            ci.NumberFormat.NumberDecimalSeparator = ".";
            Thread.CurrentThread.CurrentCulture = ci;
        }

在 app_start 开始请求和改变文化但无法解决问题的方法

应用程序在 .net 3.5 中正常运行,但升级到 .net 4.6.2 后,此问题发生在 server 2012 和 windows 10 上。

【问题讨论】:

  • double result = double.Parse("1.234", CultureInfo.InvariantCulture);
  • 感谢@Dmitry Bychenko 但是我不能更改每个 double.parse 因为它已经使用了 7000 次,而且 double.ToString 在我们的应用程序中引发了不匹配数据异常。我应该在应用程序级别修复

标签: c# .net double cultureinfo .net-4.6.2


【解决方案1】:

直接的方法是指定CultureInfo.InvariantCulture:

 string source = "1.234";

 double result = double.Parse(source, CultureInfo.InvariantCulture);

顺便说一下分配CultureInfo.InvariantCulture作为当前文化

var saved = Thread.CurrentThread.CurrentCulture;

try {
  Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

  ...

  double result = double.Parse(source);

  ... 
}
finally {
  Thread.CurrentThread.CurrentCulture = saved;
}

最后,您可能想要修改现有的当前文化(在“应用程序级别”进行修复):

CultureInfo modified = CultureInfo.CurrentCulture.Clone() as CultureInfo;

modified.NumberFormat.NumberDecimalSeparator = ".";

// Business as usual except the decimal separator which is now dot '.' 
Thread.CurrentThread.CurrentCulture = modified;

...

double result = double.Parse(source);

【讨论】:

    【解决方案2】:

    我定义了一个方法,并在应用程序中改变文化信息的每个地方都使用它

    public static void CorrectNumberFormat()
        {
            var culture = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
            if (culture.NumberFormat.NumberDecimalSeparator != ".")
            {
                culture.NumberFormat.NumberDecimalSeparator = ".";
                culture.NumberFormat.CurrencyDecimalSeparator = ".";
                culture.NumberFormat.PercentDecimalSeparator = ".";
                CultureInfo.DefaultThreadCurrentCulture = culture;
                CultureInfo.DefaultThreadCurrentUICulture = culture;
    
                Thread.CurrentThread.CurrentCulture = culture;
                Thread.CurrentThread.CurrentUICulture = culture;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 2021-08-02
      • 2013-08-01
      • 2011-10-10
      • 2017-05-16
      • 2016-11-26
      • 2014-08-19
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多