Подтвердить что ты не робот

Лучший способ разобрать поплавок?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

например:

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

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

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

Ответ 10

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