Double.Parse для поддержки родного языка

У меня есть ценность 20,55 который на немецком языке.
Когда я изменяю региональные настройки на США, значение отображается как 2055.0 после запуска этого кода:

double d = Double.Parse("20,55",CultureInfo.CurrentCUCulture);

Это почему?

3 ответа

Решение

В США десятичный разделитель .не ,, Если вы попытаетесь разобрать 20,55, он (очевидно) будет игнорировать запятые как стандартные триплетные разделители (такие как в 1,234,567.89), хотя во всех них нет трех цифр.

Если вы хотите проанализировать номер в европейском стиле, вам нужно проанализировать его с настройкой культуры в европейском стиле.

Потому что в США , такое разделитель тысяч и он игнорируется? Точно так же, как в Германии (и континентальной Европе) . такое разделитель тысяч и он игнорируется?

В Германии вы пишете: 1.000,55. В США вы пишете: 1000,55 (и есть некоторые школы мысли, которые удаляют , если есть одна цифра раньше. Так 1000,55 и 11 000,55).

Теперь, если вы хотите быть уверены, что ваша программа использует de-DE культура, передать как параметр везде

CurrentCulture culture = new CultureInfo("de-DE");

double d = double.Parse("20,55", culture);

Это потому, что десятичный разделитель США является . а не ,,

Если вы хотите избежать этой проблемы независимо от региональных настроек пользователя, вы можете написать метод расширения:

public static String ToRegionalNumber(this String str) {
    String regionalNb = str.Replace(",", NumberFormatInfo.CurrentInfo.NumberDecimalSeparator);
    regionalNb = regionalNb .Replace(".", NumberFormatInfo.CurrentInfo.NumberDecimalSeparator);
    return regionalNb ;
}

И вызывайте этот метод при работе с вашим номером:

double d = Double.Parse("20,55".ToRegionalNumber());
Другие вопросы по тегам