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


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

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

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

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

очевидным "лучшим решением" было бы определить культуру пользователя или браузер, но это не работает, если у вас есть француз, использующий en-US Windows/браузер.

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

4 56

4 ответа:

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

Я не знаю ASP.NET сторона проблемы, но .NET имеет довольно мощный класс:

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

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);

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

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

используя диапазон 200-3000, вход 1.800 или 1.800 можно однозначно интерпретировать как 1 метр и 80 сантиметров, тогда как вход 912.300 или 912.300 можно однозначно интерпретировать как 91 сантиметр и 2.3 миллиметры.