首页 > 解决方案 > 如何替换输入文本值以匹配货币类型输入

问题描述

我有一个简单的复杂问题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 中的这种情况?

标签: javascript

解决方案


你可以试试 toLocaleString 吗?

基本上,如果您有一个号码,您可以设置您在哪个国家/地区使用它。

因此,您可以显示为欧盟编号,但以其他格式发送到后端。

一个例子:

var number = 35001235.12
number.toLocaleString('en-US') // returns '35,001,235.12'

number.toLocaleString('de-De') // returns '35.001.235,12'

您可以阅读更多内容:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString


推荐阅读