Javascript 当用户键入时,将输入值转换为货币格式
我无法将输入值转换为货币格式。我想在用户键入数字(5000.00;125000.00)时自动添加千和十进制分隔符 这是我的密码:Javascript 当用户键入时,将输入值转换为货币格式,javascript,jquery,string,number-formatting,currency-formatting,Javascript,Jquery,String,Number Formatting,Currency Formatting,我无法将输入值转换为货币格式。我想在用户键入数字(5000.00;125000.00)时自动添加千和十进制分隔符 这是我的密码: $('input.CurrencyInput').on('blur, focus, keyup', function() { $(this).val().toLocaleString('en-US', { style: 'decimal', maximumFractionDigits: 2,
$('input.CurrencyInput').on('blur, focus, keyup',
function() {
$(this).val().toLocaleString('en-US', {
style: 'decimal',
maximumFractionDigits: 2,
minimumFractionDigits: 2
});
});
您的代码有几个问题:
toLocaleString
之前,您不会将收到的值转换为数字blur
之外的其他事件处理程序,因为keyup
会导致问题
$('input.CurrencyInput')。在('blur',function()上{
常量值=此.value.replace(/,/g',);
this.value=parseFloat(value).toLocaleString('en-US'{
样式:“十进制”,
最大分数位数:2,
最小分数位数:2
});
});代码>
将值解析为特定区域设置货币
下面的函数将尝试将任何乱七八糟的输入值解析为特定货币。
如果您不想强制用户以特定区域设置格式输入值,则此选项非常有用
注意事项:
由于输入可以像1,2.3.45,5那样胡言乱语,并且仍然给出有效输出(如USD:“12345.50”
),因此有一个小但用户友好的警告:
// Example: conversion to HRK (Format: n.nnn,nn)
INPUT: "0.575" OUTPUT: "0,58" // smart guessed: decimals
INPUT: "1.575" OUTPUT: "1.575,00" // smart guessed: separator
例如:
/**
*将值解析为货币
*@param{number | string}输入
*@param{string}locale-所需的区域设置,即:“en-US”“hr-hr”
*@param{string}currency-使用“USD”“EUR”“HRK”的货币
*@return{object}
*/
const parse=(输入,locale=“en-US”,currency=“USD”)=>{
设fmt=String(输入)
.更换(/(?1){
如果(+pts[0]==0)fmt=pts.join(“.”);
else如果(pts[1].length==3)fmt=pts.join(“”);
}
常数编号=编号(fmt);
常量isValid=isFinite(数字);
const string=number.toFixed(2);
const intlNFOpts=新的Intl.NumberFormat(区域设置{
风格:“货币”,
货币:货币,,
}).resolvedOptions();
常量输出=number.toLocaleString(区域设置{
…国际足联,
样式:“十进制”,
});
返回{
输入,
是有效的,
一串
数字,
货币,
产出,
};
};
示例测试:
/**
*将值解析为货币
*@param{number | string}输入
*@param{string}locale-所需的区域设置,即:“en-US”“hr-hr”
*@param{string}currency-使用“USD”“EUR”“HRK”的货币
*@return{object}
*/
const parse=(输入,locale=“en-US”,currency=“USD”)=>{
设fmt=String(输入)
.更换(/(?1){
如果(+pts[0]==0)fmt=pts.join(“.”);
else如果(pts[1].length==3)fmt=pts.join(“”);
}
常数编号=编号(fmt);
常量isValid=isFinite(数字);
const string=number.toFixed(2);
const intlNFOpts=新的Intl.NumberFormat(区域设置{
风格:“货币”,
货币:货币,,
}).resolvedOptions();
常量输出=number.toLocaleString(区域设置{
…国际足联,
样式:“十进制”,
});
返回{
输入,
是有效的,
一串
数字,
货币,
产出,
};
};
//测试:
[
//有效值
“2e5”,
"1,2.3,10,6",
"0.575",
"1.575",
"2.30",
"1.000.00",
"1.000",
1000,
1.
".4",
"4.",
"0.25",
"0.076",
"1.076",
0.3478,
"0.05",
"123,123",
"3.000,333.444,009",
"123,123.80",
"23.123,80",
"23.123,8",
"23.4",
//无效值
无效的
楠,,
无穷
“a”,
].forEach((val)=>{
常数p=parse(val,“hr”,“HRK”);
log(`INP:${p.input}\t OUT:${p.output}`);
});
.as控制台包装{最小高度:100vh;}
.val()
返回一个字符串
,但。toLocaleString
是一种数字
方法。此外,可能存在重复,您没有在任何地方设置值。您正在获取当前值并试图对其进行操作,但没有对结果执行任何操作。您无法使用oninput或keyup,因为您不知道它们是什么e计划键入。键入时,我是否能够键入1123123.123并将其格式化为1123123.12,或者键入1123123.123(这是一个有效的浮点)并将其格式化为1123123.12?您可能想看看一些外部库/插件。我过去使用过,它运行良好。(单击演示按钮-此处有货币输入)你试过这个吗?@mplungjan--是的,你可以运行这个代码段。它正确地格式化了模糊上的数字。如果我输入1123123.123
,我们可以等待OP的评论。如果这符合要求,那么就不必再进一步了。我认为这是一个很好的答案,只需让它重新输入即可。例如,键入1000
,就可以给你1000.00
。但是现在如果您更改小数点前的最后一个0,您将得到1.00
,而不是像@TylerRoper所说的那样在重新解析之前去掉逗号。但是。替换(/,/g,)
,因为none正则表达式只替换第一个,
。)