Разбор строки до числа с плавающей точкой C # - PullRequest
10 голосов
/ 20 марта 2011

У меня есть число с плавающей точкой в ​​строке.есть одна проблема.Номер использует "."не "," как десятичная точка.

Этот код не работает:

MyNumber = float.Parse("123.5");

Я знаю, что могу использовать функцию замены строки, чтобы "исправить" эту строку перед синтаксическим анализом.

MyNumber = float.Parse("123.5".Replace('.',',');

Но есть ли другой способ сделать это?

Ответы [ 3 ]

22 голосов
/ 20 марта 2011

Использование замены строк очень хрупко и может привести к ошибкам.Вместо этого укажите IFormatProvider.Например:

MyNumber = float.Parse("123.5", CultureInfo.InvariantCulture);

Или вы можете указать NumberFormatInfo, используя другую перегрузку Parse.

7 голосов
/ 20 марта 2011

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

Если это потому, что источник находится в машиночитаемом формате, в котором десятичный разделитель периода указан как часть спецификации документа, то я бы поступил точно так же, как Стивен при использовании CultureInfo.InvariantCulture.

Если это вводимые человеком данные в определенной локали, то вы захотите сопоставить эту локаль с CultureInfo, подходящим для этой локали, в противном случае, если программное обеспечение используется с другой локалью, у вас возникнет точно противоположная проблема. Как правило, вы хотите установить CurrentCulture потока, чтобы соответствовать этому (CurrentCulture для форматов, CurrentUICulture для языков). Если вы сделали это, то вам вообще не нужно передавать культуру, так как форма float.Parse(string) использует эту культуру - однако вы можете использовать float.Parse(string, CurrentCulture), чтобы явно указать, что это то, что вы делаете (и заткнуть некоторый анализ программного обеспечения, который жалуется, если вы не конкретизируете таким образом).

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

1 голос
/ 20 марта 2011

Это зависит от текущей культуры выполняемой в данный момент культуры потоков.

float.Parse("123,5", system.threading.thread.currentthread.currentculture); 

float.Parse("123.5", system.threading.thread.currentthread.currentculture); 

ЕСЛИ вам строго не нужны культурные особенности, то

float.Parse("123.5", CultureInfo.InvariantCulture);
...