Парсинг Числа с плавающей точкой: существует ли Выгода Весь алгоритм?

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

  • Американцы используют 10,000.50
  • Немцы используют 10.000,50
  • Французское использование 10 000,50

Мой первый подход должен был бы взять строку, проанализировать ее назад, пока я не встречаюсь с разделителем и использую это в качестве моего десятичного разделителя. Существует очевидный дефект с который: 10.000 был бы интерпретирован как 10.

Другой подход: если строка содержит 2 различных нечисловых символа, используйте последний в качестве десятичного разделителя и отбросьте другие. Если я только имею один, проверьте, происходит ли это несколько раз и отбрасывает его, если это делает. Если это только появляется однажды, проверьте, имеет ли это 3 цифры после него. Если да, отбросьте, это, иначе, использует его в качестве десятичного разделителя.

Очевидное "лучшее решение" состояло бы в том, чтобы обнаружить культуру или Браузер Пользователя, но это не работает, если у Вас есть француз, использующий Windows/браузер en-США.

Делает .net Framework, содержат некоторый мифический синтаксический анализатор плавающей точки черной магии, который лучше, чем Double.(Try)Parse() в попытке автоматически обнаружить числовой формат?

63
задан Ijas Ameenudeen 20 January 2019 в 13:48
поделиться

4 ответа

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

28
ответ дан Ryan Fox 24 November 2019 в 16:28
поделиться

Я не знаю сторону ASP.NET проблемы, но.NET имеет довольно мощный класс: Система. Глобализация. CultureInfo. Можно использовать следующий код для парсинга строки, содержащей двойное значение:

double d = double.Parse("100.20", CultureInfo.CurrentCulture);
//  -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);

, Если ASP.NET так или иначе (т.е. заголовки Запроса HTTP использования) передает CultureInfo текущего пользователя любому CultureInfo. CurrentCulture или CultureInfo. CurrentUICulture, они будут хорошо работать.

26
ответ дан Elanis 24 November 2019 в 16:28
поделиться

Вы не можете понравиться всем. Если я вхожу десять как 10 000, и кто-то входит десять тысяч как 10 000, Вы не можете обработать это без некоторого ведома культуры входа. Обнаружьте культуру так или иначе (браузер, параметр настройки системы - каков вариант использования? ASP? Внутреннее приложение, или открытый для мира?), или обеспечивают пример ожидаемого форматирования и используют самый снисходительный синтаксический анализатор, Вы можете. Вероятно, что-то как:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
11
ответ дан Chris Marasti-Georg 24 November 2019 в 16:28
поделиться

Различием между 12,345 на французском и английском языке является фактор 1 000. Если Вы предоставляете ожидаемый диапазон где макс. < 1000*min, можно легко предположить.

Берут, например, высоту человека (включая младенцев и детей) в мм.

При помощи диапазона 200-3000, вход 1 800 или 1,800 может однозначно быть интерпретирован как 1 метр и 80 сантиметров, тогда как вход 912 300 или 912,300 может однозначно быть интерпретирован как 91 сантиметр и 2,3 миллиметра.

9
ответ дан Michiel de Mare 24 November 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: