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
答
我所定义的方法,并用它在每一个地方在应用改变的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);
'双结果= double.Parse( “1.234”,CultureInfo.InvariantCulture);' –
谢谢@Dmitry Bychenko但我不能更改每个double.parse,因为它已经使用了7000次,并且也是double.ToString在我们的应用程序中引发了不匹配的数据异常。我应该修复应用程序级别 –