C # разбирает float из строки - PullRequest
5 голосов
/ 30 мая 2011

Я читаю числа из файлов XML.Другие числа с запятой (0,1111) и другие с точкой (0,1111).Как мне разобрать эти числа, чтобы в итоге получить желаемый результат?Я пытался использовать float.Parse(reader.Value, System.Globalization.CultureInfo.InvariantCulture);, но это не работает.Например, у меня есть reader.Value = "0,01119703" и анализируется как 1119703.0.

Ответы [ 3 ]

11 голосов
/ 30 мая 2011

Я не верю, что можно работать с двумя разными десятичными разделителями одновременно.Я думаю, что я бы просто использовал Replace (), чтобы заменить любые запятые на точки.

float.Parse(reader.Value.Replace(',', '.'), System.Globalization.CultureInfo.InvariantCulture);
4 голосов
/ 30 мая 2011

Не уверен, что это лучшее решение, но, возможно, вы могли бы положиться на набор известных «пользовательских» числовых форматов. Например, вы можете объявить два пользовательских числовых формата (с нуля или на основе известного формата), таких как:

private static readonly NumberFormatInfo DecimalSeparatorFormat = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "," };
private static readonly NumberFormatInfo CommaSeparatorFormat = new NumberFormatInfo { NumberDecimalSeparator = ",", NumberGroupSeparator = "." };

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

  if (!Single.TryParse(unparsedValue, NumberStyles.Float, DecimalSeparatorFormat, out parsedValue) && !Single.TryParse(unparsedValue, NumberStyles.Float, CommaSeparatorFormat, out parsedValue))
    throw new FormatException("Number format not supported");

Это предполагает, что у вас есть ограниченное количество известных форматов, если ваши входные данные действительно могут быть в любой культуре, то вам может не повезти с поиском отличного решения.

Единственный выигрыш этого подхода в том, что вы, по крайней мере, явно указали форматы, которые вы можете поддерживать, вместо того, чтобы полагаться на простую замену строки (которая может привести к неверному формату).

2 голосов
/ 30 мая 2011

Есть ли в файлах XML что-нибудь, что скажет вам, какой формат используется?В .NET нет встроенного способа иметь два разных разрешенных десятичных разделителя.Если ничто не говорит вам, в каком формате будет находиться число, вы всегда можете проверить, содержит ли строка точку или запятую, и создать NumberFormatInfo с этим в качестве десятичного разделителя.Конечно, это не сработает, если любое из чисел имеет точку или запятую в качестве разделителя тысяч.

...