Извлечь десятичный разделитель - PullRequest
0 голосов
/ 31 августа 2009

Я импортирую файл csv в C #, иногда с «.», Иногда с «,» в качестве десятичного разделителя.

Есть ли лучший способ определить десятичный разделитель лучше, чем считать от последнего символа до первого появления?

Заранее спасибо.

Франклин Олбриас.

Ответы [ 4 ]

6 голосов
/ 31 августа 2009

Если вы заранее знаете правильную культуру (например, потому что знаете пользователя, создавшего файл), вы можете попытаться проанализировать предоставленное значение с помощью соответствующего CultureInfo или NumberFormatInfo:

Decimal value = Decimal.Parse(input, new CultureInfo("es-ES"));

Но если тип не известен заранее, вам придется проверять его вручную, проверяя символы, пока не найдете разделитель. (И даже при таком подходе предполагается, что у вас всегда есть десятичный разделитель, такой, что one записывается как 1.0, а не 1.)

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

10,000 означает что-то допустимое , но различное для обоих форматов.

1 голос
/ 31 августа 2009

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

Посмотрите на NumberFormatInfo

Edit:
Для каждого значения попробуйте проанализировать его с одним из разделителей.
Если это не удается, попробуйте разобрать его с другим.

0 голосов
/ 31 августа 2009

В предположении, что файл содержит только цифры - без строк и вообще что-либо - и есть как минимум два столбца, вы можете сделать следующее.

Пройдите первую строку и найдите точку с запятой. Если вы его найдете, у вас есть разделенные точкой с запятой числа с запятыми в качестве десятичного разделителя, в противном случае разделенные запятой числа с точками в качестве десятичного разделителя.

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

0 голосов
/ 31 августа 2009

Это зависит от фактических данных, хранящихся в CSV-файле, и символа разделения данных (';' или ',' или '').

Если все данные всегда находятся в нотации с плавающей запятой, вы можете использовать регулярное выражение, которое проверяет оба случая. Вы можете использовать "d+,\d+" для проверки значений, разделенных ',' или "\d+\.\d+" для значений, используя '.' в качестве разделителя

...