Разбор чисел с плавающей запятой: существует ли алгоритм Catch All?

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

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

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

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

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

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

1.08.2008 19:23:13
4 ОТВЕТА
РЕШЕНИЕ

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

28
1.08.2008 23:17:53

Я не знаю 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, они будут работать нормально.

26
17.04.2019 14:27:09

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

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
11
1.08.2008 20:05:12

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

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

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

9
2.08.2008 12:28:12