我有包含千位分隔符的字符串,但是没有字符串到数字的函数想要正确使用它(使用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松散的,有时严格。我想弄清楚为这两个函数准备字符串的最佳方法。
关于数字的有效性:
'1,023.99'
是完美格式的英文编号,剥离所有逗号都会导致正确的结果。
'1,0,2,3.99'
已被破坏,但通用逗号剥离会提供'1023.99'
,这不太可能是正确的结果。
答案 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 €