正则表达式从数字字符串中剥离千位分隔符?

时间:2011-11-18 20:27:54

标签: javascript regex language-agnostic

我有包含千位分隔符的字符串,但是没有字符串到数字的函数想要正确使用它(使用JavaScript)。我正在考虑通过剥离所有千位分隔符来“准备”字符串,留下任何其他东西以及Number / parseInt / parseFloat函数(我对其行为感到满意)决定休息。但似乎我不知道哪个RegExp可以做到这一点!

也欢迎更好的想法!


UPDATE:

对不起,答案让我觉得它是多么糟糕的问题。我要实现的目标是:1)仅在任何情况下剥离千位分隔符,但2)不要打扰原始字符串,以便在无效数字的情况下获得NaN。

更新更新:

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 个答案:

答案 0 :(得分:7)

欢迎,我冒昧地把我的建议扔进锅里:

注意:已修​​订

stringWithNumbers = stringwithNumbers.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");

应该转

1,234,567.12
1,023.99
1,0,2,3.99
the dang thing costs $1,205!!
95,5,0,432
12345,0000
1,2345

成:

1234567.12
1023.99
1,0,2,3.99
the dang thing costs $1205!!
95,5,0432
12345,0000
1,2345

我希望这很有用!

修改

可能需要进行其他更改,但并非没有副作用:

(\b\d{1,3}),(?=\d{3}(\D|$))

这会将第一组数字的“一个或多个”量词(+)更改为“一到三”量词({1,3})并在之前添加“字边界”断言它。它会阻止替代1234,123 ==> 1234123。但是,它还会阻止替换可能(如果前面有字母或下划线),例如A123,789_1,555(将保持不变)

答案 1 :(得分:4)

我认为一个简单的num.replace(/,/g, '')就足够了。

答案 2 :(得分:2)

取决于您的千位分隔符

myString = myString.replace(/[ ,]/g, "");

会删除空格和逗号。

答案 3 :(得分:1)

这应该对你有用

var decimalCharacter = ".",
    regex = new RegExp("[\\d" + decimalCharacter + "]+", "g"),
    num = "10,0000,000,000.999";
+num.match(regex).join("");

答案 4 :(得分:1)

要确认数字字符串格式正确,请使用:

/^(\d*|\d{1,3}(,\d{3})+)($|[^\d])/.test(numeral_string)

如果数字字符串是(1)只是零个或多个数字的序列,或者(2)在每组三个数字之前带逗号的数字序列,则返回true,或者( 3)上面的任何一个后跟一个非数字字符,谁知道还有什么。 (案例#3适用于花车,以及你的“BARGAIN BYT!”示例。)

确认后,请使用:

numeral_string.replace(/,/g, '')

将返回数字字符串的副本,并删除所有逗号。

答案 5 :(得分:1)

我在商业环境中使用了以下内容,并且经常使用:

numberStr = numberStr.replace(/[. ,](\d\d\d\D|\d\d\d$)/g,'$1');

在上面的示例中,可以使用小数,逗号或空格标记数千个。

在某些情况下(如1000,5欧元的价格),上述方法无效。如果你需要更强大的东西,这应该100%的时间工作:

//convert a comma or space used as the cent placeholder to a decimal
$priceStr = $priceStr.replace(/[, ](\d\d$)/,'.$1');
$priceStr = $priceStr.replace(/[, ](\d$)/,'.$1');
//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;

答案 6 :(得分:1)

您可以使用s.replaceAll("(\\W)(?=\\d{3})","");

此正则表达式获取所有字母数字字符,后面带有3个字符。

4.444.444.444,00 €之类的字符串将为4444444444,00 €