我正在尝试使用具有特定量词的字符类创建一个正则表达式,该量词是一个变量,例如:
var str = "1234.00";
var quantifier = 3;
str = str.replace(/(\d)(\d{quantifier}\.)/,"$1,$2");
//str should be "1,234.00"
这工作如下(没有变量):
var str = "1234.00";
str = str.replace(/(\d)(\d{3}\.)/,"$1,$2");
//str == "1,234.00"
但是,它与带引号的模式而不是斜线分隔的模式没有相同的功能,如下所示:
var str = "1234.00";
str = str.replace("(\d)(\d{3}\.)","$1,$2");
//str == "1234.00" - not "1,234.00"
//quote symbol choice does not change this
str = str.replace('(\d)(\d{3}\.)',"$1,$2");
//str == "1234.00" - not "1,234.00"
编辑:为了更清楚,我添加了一个摘要问题,该问题在下面得到了回答: 如何使用带引号的字符串的插值变量创建正则表达式?
虽然我更喜欢使用插值,但它似乎不可用(至少在这种情况下),也没有必要。
我还尝试想出一种方法来连接/加入一些正则表达式文字以达到相同的结果,但对于这个用例却无法这样做。
作为旁注 - 我熟悉 perl 中的这种类型的正则表达式:
my $str = "1234.00";
my $quantifier = 3;
$str =~ s/(\d)(\d{$quantifier}\.)/$1,$2/;
# $str eq "1,234.00"
可以如下使用:
my $str = "1234567890.00";
for my $quantifier (qw(9 6 3)) {
$str =~ s/(\d)(\d{$quantifier}\.)/$1,$2/;
}
# $str eq "1,234,567,890.00"
根据提供的建议/答案,我创建了一个示例货币字符串原型,如下所示:
String.prototype.toCurrency = function() {
var copy = parseFloat(this).toFixed(2);
for (var times = parseInt(copy.length/3); times > 0; times--) {
var digits = times * 3;
var re = new RegExp("(\\d)(\\d{" + digits + "}\\.)");
copy = copy.replace(re,"$1,$2");
}
return '$'+copy;
};
str = "1234567890";
str.toCurrency();
// returns "$1,234,567,890.00"