Регулярное выражение для удаления разделителя тысяч из числовой строки?
у меня есть строки, которые содержат тысячи разделителей, однако ни одна функция string-to-number не хочет использовать ее правильно (используя JavaScript). Я думаю о том, чтобы" подготовить " строку, сняв все тысячи сепараторов, оставив что-нибудь еще неточным и позволяя Number
/parseInt
/parseFloat
функции (я доволен их поведением в противном случае), чтобы решить остальное. Но кажется, что я понятия не имею, какой RegExp может это сделать!
лучшие идеи приветствуются тоже!
обновление:
извините, ответы просветили меня, насколько плохо сформулирован вопрос. То, что я triyng, чтобы достичь: 1) очистить тысячу сепараторов, только если таковые имеются, но 2) Не беспокоить исходную строку, поэтому я получу NaNs в случаях недопустимых цифр.
БОЛЬШЕ ОБНОВЛЕНИЙ:
JavaScript ограничен английским языком для синтаксического анализа, поэтому предположим, что разделитель тысяч", " для простоты (естественно, он никогда не соответствует десятичному разделитель в любой локали, поэтому переход на любую другую локаль не должен представлять проблемы)
теперь, при разборе функций:
parseFloat('1023.95BARGAIN BYTES!') // parseXXX functions just "gives up" on invalid chars and returns 1023.95
Number('1023.95BARGAIN BYTES!') // while Number constructor behaves "strictly" and will return NaN
иногда я использую rhw свободный, иногда строгий. Я хочу выяснить лучший подход для подготовки строки для обеих функций.
о валидности цифр:
'1,023.99'
это прекрасно сформированный английский номер, и удаление всех запятых приведет к правильному результату.
'1,0,2,3.99'
сломан, однако общая запятая зачистки даст '1023.99'
что вряд ли будет правильным результатом.
7 ответов
уэлп, я рискну бросить свое предложение в горшок:
Примечание: Пересмотренный
stringWithNumbers = stringwithNumbers.replace(/(\d+),(?=\d{3}(\D|$))/g, "");
следует включить
1,234,567.12
1,023.99
1,0,2,3.99
the dang thing costs ,205!!
95,5,0,432
12345,0000
1,2345
в:
1234567.12
1023.99
1,0,2,3.99
the dang thing costs 05!!
95,5,0432
12345,0000
1,2345
Я надеюсь, что это полезно!
EDIT:
дополнительное изменение которое может быть необходимо, но не без побочных эффектов:
(\b\d{1,3}),(?=\d{3}(\D|$))
это изменяет Квантор" один или несколько" (+
) для первого набора из цифр в Квантор" от одного до трех" ({1,3}
) и добавляет перед ним утверждение "Word-boundary". Это предотвратит замену, как 1234,123
==>1234123
. Однако это также предотвратит замену, которая может желательно (если ему предшествует буква или подчеркивание), например A123,789
или _1,555
(который останется неизменным).
зависит от того, что ваш тысячный разделитель
myString = myString.replace(/[ ,]/g, "");
удалит пробелы и запятые.
Это должно работать для вас
var decimalCharacter = ".",
regex = new RegExp("[\d" + decimalCharacter + "]+", "g"),
num = "10,0000,000,000.999";
+num.match(regex).join("");
чтобы убедиться, что числовая строка хорошо сформирована, используйте:
/^(\d*|\d{1,3}(,\d{3})+)($|[^\d])/.test(numeral_string)
что вернет true
Если числовая строка является либо (1) просто последовательностью нулевых или более цифр, либо (2) последовательностью цифр с запятой перед каждым набором из трех цифр, либо (3) Любой из вышеперечисленных, за которым следует незначный символ и кто знает, что еще. (Случай №3 для поплавков, а также ваши "байты сделки!" образцы.)
как только вы подтвердите это, использовать:
numeral_string.replace(/,/g, '')
который вернет копию числительной строки со всеми запятыми, вырезанными.
можно использовать s.replaceAll("(\W)(?=\d{3})","");
это регулярное выражение получает весь буквенно-цифровой символ с 3 символами после него.
строки 4.444.444.444,00 €
будет 4444444444,00 €
я использовал следующее в коммерческой обстановке, и он часто работал:
numberStr = numberStr.replace(/[. ,](\d\d\d\D|\d\d\d$)/g,'');
в приведенном выше примере тысячи могут быть отмечены десятичной запятой, запятой или пробелом.
в некоторых случаях ( например, цена 1000,5 евро) выше не работает. Если вам нужно что-то более крепкое, это должно работать 100% времени:
//convert a comma or space used as the cent placeholder to a decimal
$priceStr = $priceStr.replace(/[, ](\d\d$)/,'.');
$priceStr = $priceStr.replace(/[, ](\d$)/,'.');
//capture cents
var $hasCentsRegex = /[.]\d\d?$/;
if($hasCentsRegex.test($priceStr)) {
var $matchArray = $priceStr.match(/(.*)([.]\d\d?$)/);
var $priceBeforeCents = $matchArray[1];
var $cents = $matchArray[2];
} else{
var $priceBeforeCents = $priceStr;
var $cents = "";
}
//remove decimals, commas and whitespace from the pre-cent portion
$priceBeforeCents = $priceBeforeCents.replace(/[.\s,]/g,'');
//re-create the price by adding back the cents
$priceStr = $priceBeforeCents + $cents;