Javascript 使用替换和正则表达式应用货币格式
我试图理解一些将数字转换为货币格式的代码。因此,如果您有16.9美元,它将转换为16.90美元。代码的问题是,如果金额超过1000美元,它只返回1美元,超过2000美元返回2美元,以此类推。成百上千的金额显示为罚款 以下是函数:Javascript 使用替换和正则表达式应用货币格式,javascript,regex,Javascript,Regex,我试图理解一些将数字转换为货币格式的代码。因此,如果您有16.9美元,它将转换为16.90美元。代码的问题是,如果金额超过1000美元,它只返回1美元,超过2000美元返回2美元,以此类推。成百上千的金额显示为罚款 以下是函数: var _formatCurrency = function(amount) { return "$" + parseFloat(amount).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,') }; (括号后面
var _formatCurrency = function(amount) {
return "$" + parseFloat(amount).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
};
(括号后面加分号的原因是因为该函数本身是另一个函数中的语句。该函数与本讨论无关。)
我发现最初将代码放入其中的人在某个地方找到了它,但没有完全理解它,也没有测试这个特定场景。我本人并没有太多地处理正则表达式。我不仅试图修复它,而且想了解它现在是如何工作的
这是我发现的。开括号后的反斜杠和
g
前的反斜杠之间的代码是模式。g
表示全局搜索。\d
表示数字,(?=\d{3})+.
表示查找3位数字加一个小数点。我不确定我是否有这个权利,因为如果这是正确的,它不应该忽略像5.4这样的数字吗?那很好。另外,我不确定“$1”是做什么用的。在我看来,它应该放在数字所在的位置,但这不会把所有数字都改成1美元吗?另外,为什么在1后面有一个逗号?假设您只使用USD,那么这应该是正则表达式的替代方法。我还包括了一些测试来验证它是否正常工作
var test1='16.9';
var test2='2000.5';
var test3='300000.23';
var test4='3000000.23';
函数StringToSD(inputString){
const splitValues=inputString.split('.');
常量wholeNumber=splitValues[0]。拆分(“”)
.map(val=>parseInt(val))
.reverse()
.map((val,idx,arr)=>idx!==0&&(idx+1)%3==0&&arr[idx+1]!==未定义?`,${val}`:val)
.reverse()
.加入(“”);
返回parseFloat(`${wholeNumber}.${splitValues[1]}`).toFixed(2);
}
log(stringToUSD(test1));
log(stringToUSD(test2));
log(stringToUSD(test3));
log(stringToUSD(test4))代码>模式无效,您对函数的理解不正确。此函数将数字格式化为标准美国货币,其工作原理如下:
parseFloat()
函数将字符串值转换为十进制数
toFixed(2)
函数将十进制数舍入到小数点后的2位
此处使用replace()
函数添加千位分隔符(即每3位后面加一个逗号)。模式不正确,因此建议使用以下修复方法/(\d)(?=(\d{3})+\)/g
,其工作原理如下:
(\d)
捕获一个数字
(?=(\d{3})+\)
称为向前看,它确保上面捕获的数字有一组3位(\d{3})
或更多+
后跟小数点\。
后跟小数点
g
标志/修饰符用于全局应用模式,即在整个金额上应用模式
- 替换
$1,
将模式替换为第一个捕获的组$1
,在我们的例子中,该组是数字(\d)
(因此从技术上讲,将数字替换为数字本身以确保在替换中不会丢失数字),后跟逗号,
。就像我说的,这只是为了添加千分位
下面是一些建议修复的测试。请注意,它适用于数字和字符串:
var\u formatCurrency=函数(金额){
返回“$”+parseFloat(amount).toFixed(2).替换(/(\d)(?=(\d{3})+\)/g,'$1');
};
console.log(_formatCurrency('1'));
console.log(_formatCurrency('100'));
console.log(_formatCurrency('1000'));
console.log(_formatCurrency('1000000.559'));
console.log(_formatCurrency('1000000000.559');
console.log(_formatCurrency(1));
console.log(_formatCurrency(100));
console.log(_formatCurrency(1000));
console.log(_formatCurrency(1000000.559));
console.log(_formatCurrency(1000000000.559))代码>关于您的评论
我希望编辑正则表达式,这样它就可以正常工作了
你目前使用的正则表达式显然不能为你工作,所以我认为你应该考虑替代品,即使它们不是太相似,并且
试图使代码更改尽可能小
可以理解,但有时使用稍微大一点、可读性更强的代码比使用简洁和象形文字要好
恢复营业:
我假设你得到一个字符串作为参数,这个字符串只由数字组成,在最后1或2个数字之前可能有点,也可能没有点。差不多
//input //intended output
1 $1.00
20 $20.00
34.2 $34.20
23.1 $23.10
62516.16 $62,516.16
15.26 $15.26
4654656 $4,654,656.00
0.3 $0.30
我将让您对(假定的)非有效项进行预检查,如1。2.2。.64.8.14.856等
提议的解决办法:
var\u formatCurrency=函数(金额){
amount=“$”+amount.replace(/(\d)(?=(\d{3})+(\(\d{0,2})*$)/g,“$1”);
if(amount.indexOf('.')=-1)
退货金额+'.00';
风险值小数=金额分割('.')[1];
返回小数。长度<2?金额+0:金额;
};
正则表达式细分:
(\d)
:匹配一位数字。括号用于在需要时进行引用
(?=(\d{3})+(\.(\d{0,2})*$)
。现在这个家伙。从头到尾:
$
:匹配字符串的结尾。这使您可以从末尾而不是从开头进行匹配,这对于添加逗号非常方便
<
var _formatCurrency = function(amount) {
amount = "$" + amount.replace(/(\d)(?=(\d{3})+(\.(\d){0,2})*$)/g, '$1,');
if(amount.indexOf('.') === -1)
return amount + '.00';
var decimals = amount.split('.')[1];
return decimals.length < 2 ? amount + '0' : amount;
};