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

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
64
0
3 249
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не знаю стороны проблемы ASP.NET, но у .NET есть довольно мощный класс: System.Globalization.CultureInfo. Вы можете использовать следующий код для анализа строки, содержащей значение типа double:

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 на французском и английском языках составляет 1000 раз. Если вы укажете ожидаемый диапазон, где max

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

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

Другие вопросы по теме