CultureInfo и Double.parse и double.toString работали неправильно

Как я могу заставить приложение С# использовать файлы . для десятичного разделителя и игнорировать настройки культуры на сервере. У меня есть эта проблема с 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.


person Hamed Mahdizadeh    schedule 03.07.2017    source источник
comment
Спасибо @Dmitry Bychenko Но я не могу изменить каждый double.parse, потому что он использовался 7000 раз, а также double.ToString вызывает исключение несоответствия данных в нашем приложении. Я должен исправить на уровне приложения   -  person Hamed Mahdizadeh    schedule 03.07.2017


Ответы (2)


Прямой способ — указать 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);
person Dmitry Bychenko    schedule 03.07.2017

Я определил метод и использую его везде в приложении, которое изменяет культурную информацию.

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;
        }
    }
person Hamed Mahdizadeh    schedule 03.07.2017