CultureInfo和Double.parse和double.toString不能正常工作

问题描述:

如何强制c#应用程序使用。为小数点分隔而忽略服务器中的文化设置。我有这个问题double.ToString和double.parse 由于大规模的应用程序,我应该改变应用程序级别的设置。万一像double.parseCultureInfo和Double.parse和double.toString不能正常工作

例外occurse( “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发生在服务器2012 4.6.2这个问题和Windows 10

+0

'双结果= double.Parse( “1.234”,CultureInfo.InvariantCulture);' –

+0

谢谢@Dmitry Bychenko但我不能更改每个double.parse,因为它已经使用了7000次,并且也是double.ToString在我们的应用程序中引发了不匹配的数据异常。我应该修复应用程序级别 –

我所定义的方法,并用它在每一个地方在应用改变的CultureInfo

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; 
     } 
    } 

直接的办法就是指定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);