Double.TryParse () входной десятичный разделитель отличается от системного десятичного разделителя - PullRequest
10 голосов
/ 16 мая 2010

У меня есть исходный XML, который использует точку (".") В качестве десятичного разделителя, и я анализирую это в системе, которая использует запятую (",") в качестве десятичного разделителя.

В результате значение 0,7 анализируется с Double.TryParse или Double.Parse как 7000000.

Какие есть варианты для правильного разбора? Один из них - заменить точки в источнике запятыми на String.Replace('.', ','), но я не думаю, что мне это очень нравится.

Ответы [ 4 ]

22 голосов
/ 16 мая 2010

Стандарт XML четко определяет форматирование дат, чисел и т. Д. Это помогает гарантировать, что XML не зависит от платформы и совместим. Посмотрите, как использовать XmlConvert для XML-данных.

double value = XmlConvert.ToDouble(stringValue);
16 голосов
/ 16 мая 2010

Это делает работу:

    string test = "0.7";
    Assert.Equal(0.7, Double.Parse(test, NumberStyles.Float, CultureInfo.InvariantCulture));
12 голосов
/ 16 мая 2010

double.TryParse имеет перегрузку, принимающую IFormatProvider. Используйте соответствующий CultureInfo, в вашем случае можно использовать CultureInfo.InvariantCulture.

8 голосов
/ 15 января 2014

Простой способ указать пользовательский десятичный разделитель:

var price = "122$00";
var nfi = new NumberFormatInfo { CurrencyDecimalSeparator = "$" };
var ok = decimal.TryParse(price, NumberStyles.Currency, nfi, out result);
...