Сведения о вопросе

Drake

16:03, 1st July, 2020

Теги

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

Просмотров: 425   Ответов: 4

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

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

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

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

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

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



  Сведения об ответе

SILA

18:03, 1st July, 2020

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


  Сведения об ответе

fo_I_K

18:03, 1st July, 2020

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


  Сведения об ответе

LAST

18:03, 1st July, 2020

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

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


  Сведения об ответе

VCe znayu

18:03, 1st July, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться