Одна из забавных частей мультикультурного программирования является числовыми форматами.
Мой первый подход должен был бы взять строку, проанализировать ее назад, пока я не встречаюсь с разделителем и использую это в качестве моего десятичного разделителя. Существует очевидный дефект с который: 10.000 был бы интерпретирован как 10.
Другой подход: если строка содержит 2 различных нечисловых символа, используйте последний в качестве десятичного разделителя и отбросьте другие. Если я только имею один, проверьте, происходит ли это несколько раз и отбрасывает его, если это делает. Если это только появляется однажды, проверьте, имеет ли это 3 цифры после него. Если да, отбросьте, это, иначе, использует его в качестве десятичного разделителя.
Очевидное "лучшее решение" состояло бы в том, чтобы обнаружить культуру или Браузер Пользователя, но это не работает, если у Вас есть француз, использующий Windows/браузер en-США.
Делает .net Framework, содержат некоторый мифический синтаксический анализатор плавающей точки черной магии, который лучше, чем Double.(Try)Parse()
в попытке автоматически обнаружить числовой формат?
Я думаю лучшее, которое можно сделать, в этом случае должен взять их вход и затем показать им, что Вы думаете, что они имели в виду. Если они не соглашаются, покажите им формат, Вы ожидаете и заставляете их вводить его снова.
Я не знаю сторону 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, они будут хорошо работать.
Вы не можете понравиться всем. Если я вхожу десять как 10 000, и кто-то входит десять тысяч как 10 000, Вы не можете обработать это без некоторого ведома культуры входа. Обнаружьте культуру так или иначе (браузер, параметр настройки системы - каков вариант использования? ASP? Внутреннее приложение, или открытый для мира?), или обеспечивают пример ожидаемого форматирования и используют самый снисходительный синтаксический анализатор, Вы можете. Вероятно, что-то как:
double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Различием между 12,345 на французском и английском языке является фактор 1 000. Если Вы предоставляете ожидаемый диапазон где макс. < 1000*min, можно легко предположить.
Берут, например, высоту человека (включая младенцев и детей) в мм.
При помощи диапазона 200-3000, вход 1 800 или 1,800 может однозначно быть интерпретирован как 1 метр и 80 сантиметров, тогда как вход 912 300 или 912,300 может однозначно быть интерпретирован как 91 сантиметр и 2,3 миллиметра.