Регулярное выражение для удаления разделителя тысяч из числовой строки?

у меня есть строки, которые содержат тысячи разделителей, однако ни одна функция 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 (который останется неизменным).


простой num.replace(/,/g, '') должно быть достаточно, я думаю.


зависит от того, что ваш тысячный разделитель

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;