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());