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);
Другие вопросы по тегам