CultureInfo и Double.parse и double.toString не работали правильно
Как я могу заставить приложение 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 эта проблема возникла на сервере 2012 и Windows 10.
2 ответа
Я определил метод и использую его в любом месте приложения, которое меняет 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);