У меня 2,299.00
есть строка, и я пытаюсь разобрать ее на число. Я пробовал использовать parseFloat
, что дало 2. Думаю, проблема в запятой, но как мне решить эту проблему правильно? Просто убрать запятую?
var x = parseFloat("2,299.00")
alert(x);
javascript
number-formatting
user1540714
источник
источник
.replace(/,/g, '')
Это регулярное выражение использует глобальное значениеg
для замены-все.parseFloat("2,000,000.00".replace(',',''))
возвращает2000
и 2. Он не работает во многих регионах мира, где,
используется десятичный разряд, например,parseFloat("2.000.000,00".replace(',',''))
возвращает2
- см. Мой ответ ниже о том, что работает повсюду в мире.Удаление запятых потенциально опасно, потому что, как другие упоминали в комментариях, во многих регионах запятая используется для обозначения чего-то другого (например, десятичного знака).
Я не знаю, откуда у вас строка, но в некоторых местах в мире
"2,299.00"
=2.299
Intl
Объект мог бы быть хороший способ решить эту проблему, но каким - то образом им удалось отправить спецификацию с толькоIntl.NumberFormat.format()
API и неparse
аналог :(Единственный способ разобрать строку с культурными числовыми символами в ней до распознаваемого машиной числа любым разумным способом i18n - это использовать библиотеку, которая использует данные CLDR, чтобы охватить все возможные способы форматирования числовых строк http: //cldr.unicode. org /
Два лучших варианта JS, с которыми я сталкивался на данный момент:
источник
В современных браузерах вы можете использовать встроенный Intl.NumberFormat для определения форматирования чисел в браузере и нормализации ввода для соответствия.
Очевидно, у них есть место для некоторой оптимизации и кеширования, но это надежно работает на всех языках.
источник
const cleanPattern = new RegExp("[^-+0-9" + example.charAt( 1 ) + "]", 'g');
- строки шаблона "` "не поддерживаются IE - caniuse.com/#search=template%20stringУдалите все, что не является цифрой, десятичной точкой или знаком минус (
-
):Обновленная скрипка
Обратите внимание, что это не сработает для чисел в научном представлении. Если вы хотите , чтобы, изменить
replace
строку , чтобы добавитьe
,E
и+
в список допустимых символов:источник
str = str.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");
Это то, что я бы использовал, но я совершенно бесполезен в регулярном выражении, и это то, что я нашел некоторое время назад в каком-то другом потоке SO.parseFloat
- что подтвердит его. :-)Обычно вам следует подумать об использовании полей ввода, которые не позволяют вводить произвольный текст для числовых значений. Но могут быть случаи, когда нужно угадать формат ввода. Например, 1,234,56 в Германии означает 1,234,56 в США. См. Https://salesforce.stackexchange.com/a/21404 для получения списка стран, в которых запятая используется в качестве десятичной дроби.
Я использую следующую функцию, чтобы сделать предположение и удалить все нечисловые символы:
Попробуйте здесь: https://plnkr.co/edit/9p5Y6H?p=preview
Примеры:
У функции есть одно слабое место: невозможно угадать формат, если у вас 1,123 или 1,123 - потому что в зависимости от формата локали оба могут быть запятой или разделителем тысяч. В этом особом случае функция будет рассматривать разделитель как разделитель тысяч и возвращать 1123.
источник
3,00 €
тоже заменено на 3.00. Просто примечание,3,001
отформатированное в3001
. Чтобы этого избежать, всегда вводите десятичные символы. Напр.3,001.00€
3,001.00
Конвертирует правильно. Также обновите jsfiddle.0,124
там еще конвертируется в 124Удивительно, что они включили toLocaleString, но не метод синтаксического анализа . По крайней мере, toLocaleString без аргументов хорошо поддерживается в IE6 +.
Для решения i18n я придумал следующее:
Сначала определите десятичный разделитель локали пользователя:
Затем нормализуйте число, если в строке более одного десятичного разделителя:
Наконец, удалите все, что не является числом или десятичным разделителем:
источник
Это упрощенная ненавязчивая обертка вокруг
parseFloat
функции.источник
Если вы хотите избежать проблемы, которую опубликовал Дэвид Мейстер, и вы уверены в количестве десятичных знаков, вы можете заменить все точки и запятые и разделить на 100, например:
или если у вас 3 десятичных знака
Вам решать, хотите ли вы использовать parseInt, parseFloat или Number. Также, если вы хотите сохранить количество десятичных знаков, вы можете использовать функцию .toFixed (...).
источник
Все эти ответы не верны, если у вас есть число в миллионы.
3,456,789 просто вернет 3456 с помощью метода replace.
Самый правильный ответ для простого удаления запятых должен быть.
Или просто написано.
источник
Это преобразует число в любом языковом стандарте в нормальное число. Работает и для десятичных знаков:
источник
источник
С помощью этой функции вы сможете форматировать значения в нескольких форматах, таких как
1.234,56
и1,234.56
, и даже с такими ошибками, как1.234.56
и1,234,56
источник
Если вы хотите получить ответ, сделайте это так. В примере используется валюта, но она вам не нужна. Библиотеку Intl нужно будет заполнить полифиллами, если вам нужно поддерживать старые браузеры.
источник
replace()
заменяет только первое совпадение, если не используетсяRegExp
с'g'
флагом.,
что в некоторых регионах находится в разделителе запятойЗамените запятую пустой строкой:
источник
Если у вас есть небольшой набор локалей для поддержки, вам, вероятно, будет лучше, если жестко запрограммировать пару простых правил:
источник
Функция split разбивает строку на массив, используя "," в качестве разделителя, и возвращает массив.
Функция соединения объединяет элементы массива, возвращаемого функцией разделения.
Функция Number () преобразует объединенную строку в число.
источник