Лучший способ разобрать поплавок? - PullRequest
37 голосов
/ 29 сентября 2008

Каков наилучший способ анализа поплавка в CSharp? Я знаю о TryParse, но меня особенно интересуют точки, запятые и т. Д.

У меня проблемы с моим сайтом. На моем сервере разработчика, ',' для десятичных дробей, '.' для разделителя. На сервере prod все наоборот. Как мне лучше всего это запечатлеть?

Ответы [ 10 ]

47 голосов
/ 29 сентября 2008

Я согласен с ответом Леппи; выразить это в виде кода:

string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);
25 голосов
/ 29 сентября 2008

Зависит от того, откуда поступает ввод.

Если ваш вклад поступает от пользователя, вы должны использовать CultureInfo, который использует пользователь / страница ( Thread.CurrentThread.CurrentUICulture ).

Вы можете узнать и указать культуру пользователя, посмотрев на свойство HttpRequest.UserLanguages ​​. (Неправильно 100%, но я считаю, что это очень хорошее первое предположение). С этой информацией вы можете установить Thread.CurrentThread.CurrentUICulture в начале страницы.

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

Метод Parse несколько проще в использовании, если ваш ввод от контролируемого источника. То есть вы уже проверили строку. Parse выдает (медленное) исключение, если его не удается.

Если вход не контролируется, (от пользователя или другого интернет-источника) TryParse выглядит мне лучше.

6 голосов
/ 29 сентября 2008

Вы всегда можете использовать перегрузку Parse , которая включает используемую культуру?

Например:

double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting

Если у вас есть контроль над всеми вашими данными, вы должны использовать «CultureInfo.InvariantCulture» во всем своем коде.

6 голосов
/ 29 сентября 2008

Если вы хотите сохранить постоянные значения (числа, дата, время и т. Д.) Для внутренних целей. Каждый раз используйте «InvariantCulture» для форматирования и анализа значений. «InvariantCulture» одинаков на всех компьютерах, в каждой ОС с любой культурой / языком пользователя и т. Д. ...

string strFloat = (15.789f).ToString(System.Globalization.CultureInfo.InvariantInfo);
float numFloat  = float.Parse(System.Globalization.CultureInfo.InvariantInfo, strFloat);
string strNow   = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantInfo);
DateTime now    = DateTime.Parse(System.Globalization.CultureInfo.InvariantInfo, strNow);
3 голосов
/ 29 сентября 2008

Используйте нейтральную культуру (или ту, которую вы знаете) при разборе с Try / Parse.

1 голос
/ 29 сентября 2008

Передайте CultureInfo или NumberFormatInfo , представляющее культуру, в которой вы хотите проанализировать число с плавающей точкой; это определяет, какие символы используются для десятичных дробей, разделителей групп и т. д.

Например, чтобы убедиться, что '.' символ обрабатывался как десятичный индикатор, который можно передать в CultureInfo.InvariantCulture (этот тип обычно очень полезен в серверных приложениях, где требуется, чтобы все было одинаково независимо от культуры среды).

0 голосов
/ 30 сентября 2008

Вы можете узнать текущую Cuklture вашего сервера с простым утверждением:

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;

Обратите внимание, что существует свойство CurrentUICulture, но UICulture используется из многоязычных приложений ResourceMeanager. для форматирования чисел необходимо учитывать CurrentCulture.

Я надеюсь, что это поможет вам

0 голосов
/ 30 сентября 2008

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

0 голосов
/ 30 сентября 2008

Источник - информация с веб-сайта. Я не могу полагаться на это быть действительным. Так что я пошел с TryParse, как упоминалось ранее. Но я не могу понять, как передать ему текущую культуру.

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

0 голосов
/ 29 сентября 2008

Старайтесь избегать float.Parse, используйте TryParse, поскольку он работает намного лучше, но выполняет ту же работу. это также относится к double, DateTime и т. д. *

(некоторые типы также предлагают TryParseExact, который также работает еще лучше!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...