Число с плавающей запятой разбора: Есть ли Поймай Весь алгоритм?

голоса
52

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

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

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

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

Очевидное «лучшее решение» было бы обнаружить культуру пользователя или браузер, но это не работает, если у вас есть француз, используя EN-US Windows / Browser.

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

Задан 01/08/2008 в 20:23
источник пользователем
На других языках...                            


4 ответов

голоса
26

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

Ответил 02/08/2008 в 00:17
источник пользователем

голоса
26

Я не знаю , на сторону ASP.NET проблем , но .NET имеет довольно мощный класс: System.Globalization.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, они будут работать нормально.

Ответил 01/08/2008 в 21:02
источник пользователем

голоса
11

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

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
Ответил 01/08/2008 в 21:05
источник пользователем

голоса
9

Разница между 12.345 на французском и английском языках является фактором 1000. Если вы поставляете ожидаемый диапазон, где макс <1000 * мин, вы можете легко догадаться.

Возьмем, например, высоту человека (в том числе младенцев и детей) в мм.

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

Ответил 02/08/2008 в 13:28
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more