Javascript 从数字字符串中去掉千位分隔符的正则表达式?

Javascript 从数字字符串中去掉千位分隔符的正则表达式?,javascript,regex,language-agnostic,Javascript,Regex,Language Agnostic,我有包含千个分隔符的字符串,但是没有字符串到数字的函数希望正确使用它(使用JavaScript)。我正在考虑通过剥离所有千个分隔符来“准备”字符串,保留任何未处理的内容,并让Number/parseInt/parseFloat函数(我对它们的其他行为感到满意)来决定其余部分。但似乎我不知道哪个RegExp可以做到这一点 更好的想法也是受欢迎的 更新: 对不起,答案告诉我这个问题的表述有多糟糕。我所要做的是:1)去掉千个分隔符(如果有的话),但2)不要太多地干扰原始字符串,这样在无效数字的情况下

我有包含千个分隔符的字符串,但是没有字符串到数字的函数希望正确使用它(使用JavaScript)。我正在考虑通过剥离所有千个分隔符来“准备”字符串,保留任何未处理的内容,并让
Number
/
parseInt
/
parseFloat
函数(我对它们的其他行为感到满意)来决定其余部分。但似乎我不知道哪个RegExp可以做到这一点

更好的想法也是受欢迎的


更新: 对不起,答案告诉我这个问题的表述有多糟糕。我所要做的是: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松的,有时严格的。我想找出为这两个函数准备字符串的最佳方法

关于数字的有效性:

'1023.99'
是格式完美的英文数字,去掉所有逗号将得到正确的结果。
'1,0,2,3.99'
已断开,但通用逗号剥离将给出不太可能是正确结果的
'1023.99'

取决于千位分隔符是什么

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

将删除空格和逗号。

我认为一个简单的
num.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)
如果数字字符串是(1)仅由零位或多位数字组成的序列,或(2)在每组三位数字之前带有逗号的数字序列,或(3)以上任意一位后跟非数字字符,谁知道还有什么,则返回
true
。(案例#3适用于浮动,以及您的“廉价字节!”示例。)

确认后,请使用:

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

这将返回一个数字字符串的副本,其中删除了所有逗号。

好吧,我冒昧地把我的建议扔进锅里:

注:已修订

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
进入:

我希望这是有用的

编辑:

可能需要进行额外改动,但并非没有副作用:

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

这将第一组数字的“一个或多个”量词(
+
)更改为“一到三”量词(
{1,3}
),并在其前面添加一个“单词边界”断言。它将阻止像
1234123
==>
1234123
这样的替换。但是,它也会阻止可能需要的替换(如果前面有字母或下划线),例如
A123789
\u 1555
(将保持不变)。

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

numberStr=numberStr.replace(/[,](\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;

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

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


4.444.444.444,00€
这样的字符串将是
4444,00€

分隔符是逗号还是点?也就是说,1.2万表示为“12000”,还是表示为“12000”?(或者其他什么?@ruakh,实际上是一个空格,但它不相关,因为JavaScript根本不支持语言环境。它是相关的,因为您的正则表达式必须知道要删除哪个分隔符!请给出前后字符串的示例,例如:
12345678
==>
12345678
他说,“我刚赢了2500000美元!!!”==>
他说,“我刚刚赢了25000000美元!!!”
一英里有5280英尺,对吗?
==>
一英里有5280英尺,对吗?
或者你能想到的任何东西of@CodeJockey,我已经更新了这个问题,希望它更好的JavaScript字符串没有
replaceAll
方法。也许你在想Java?@ruakh:是的,但当你的评论通过时,我已经修复了它但若输入的数字格式不正确,比如
'1,02,4'
,那个么这些并不是千个分隔符。如果应该将其解释为1024,那么获取该值的代码是相同的。问题是:简单的方法将把它们作为千个分隔符,我将得到1024个正确的结果(对于JavaScript环境)
parseInt('1,02,4')==1
Number('1,02,4')==NaN
我想我发现了一个bug,
'300300'。替换(/(\d+),(?=\d{3})/g,“$1”)
仍然会去掉一个逗号。我如何调整前瞻断言,使其恰好在3位数字后停止?
。替换(/(\d+),(?=\d{3})(\d$)/g,“$1$2”);
@Jan Kuča,'1030000'。替换(/(\d+),(?=\d{3})(\d$)/g,'1$2')返回“1030000”@user539484-我相信您寻求的解决方案已添加到我的答案中。它与Jan Kuča提出的解决方案非常接近,但在前瞻性断言中包含了非数字匹配。@JanKuča-非常接近,除了“非数字或结束断言”的位置match不能是match的一部分,而必须是look-ahead断言的一部分。当它被表示为match的一部分时,它将拒绝任何有效的匹配,因为它尝试使用与前一个look-ahead相同的字符。匹配一个或多个数字后,它将匹配逗号。然后,它将前瞻性地断言还有三个数字。如果有三个数字,则表示“非数字或结束”匹配
//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;