Вопрос

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

У меня проблемы с моим сайтом.На моем Dev Server, «», для десятичных декораций, «». для сепаратора.Однако на прод-сервере все наоборот.Как мне лучше всего это запечатлеть?

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);

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

Например:

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

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

Если вы хотите сохранить значения (числа, дату, время и т. д.)) для внутреннего назначения.Каждый раз используйте «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);

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top