javascript - 如何替换输入文本值以匹配货币类型输入
问题描述
我有一个简单的复杂问题input
。我希望用户输入金额,所以我自然想到了使用number
类型。问题是我住在欧洲,小数是用逗号写的(所以输入的数字会自动添加一个逗号作为分隔符),但我的后端逻辑需要点表示美分。
在到处寻找这个问题的替代方案后,我只发现我可以使用一个text
输入并用一个链检查用户的输入,.replace
以测试用户是否只输入数字,最终一个点后跟两个数字表示美分。
这是我们到目前为止创建的代码:
export const onChangeCustomInput = (e) => {
let value = e.target.value
value = value
.replace(/[A-Za-z]+$/g, '')
.replace(/,/g, '.')
.replace(/ /g, '')
.replace(/\B(?=(\d{3})+(?!\d))/g, ' ')
.replace(/[.\s]{2,}/, '.')
.split('.')
if (typeof value === 'object' && value.length > 1) {
value[1] = value[1].substr(0, 2)
if (value.length === 3) {
value.splice(2, 1)
}
value = value.join('.')
}
e.target.value = typeof value === 'object' ? value[0] : value
}
这是非常繁重(且丑陋)的代码,Sonar 检查失败,说这可能导致拒绝服务攻击(?...)。
有没有更好的方法来管理香草 javascript 中的这种情况?
解决方案
你可以试试 toLocaleString 吗?
基本上,如果您有一个号码,您可以设置您在哪个国家/地区使用它。
因此,您可以显示为欧盟编号,但以其他格式发送到后端。
一个例子:
var number = 35001235.12
number.toLocaleString('en-US') // returns '35,001,235.12'
number.toLocaleString('de-De') // returns '35.001.235,12'
推荐阅读
- node.js - React 部署中断了吗?
- angular - 我可以使用 webpack.ProvidePlugin 添加对 MicrosoftAjax.js 的引用吗?
- javascript - 有没有办法在 html javascript 中重写裸域 url
- html - 触发子更新
- laravel - Laravel Mix 在生产模式下运行,但不在开发模式下
- python - 双向插值的替代方法
- swift - 从字符串初始化一个浮点数
- angular - Angular - 防止(ngModelChange)在 HTML 渲染上被调用
- django - 通过公开的 API 端点访问 Django 3 TextChoices?
- javafx - 减少 JavaFX 的延迟