You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整文本输入框值适配货币格式 解决欧区逗号转点输入需求

金额输入格式化优化方案

原代码触发Sonar拒绝服务告警的核心原因是使用的千分位匹配正则存在嵌套量词,极端长输入场景下会触发大量正则回溯,导致JS线程阻塞,也就是常说的正则拒绝服务(ReDoS)问题,同时多步replace和数组操作逻辑冗余,可直接简化为以下实现:

export const onChangeCustomInput = (e) => {
  // 预处理:逗号统一转点,过滤所有非数字、非点的无效字符
  let rawVal = e.target.value.replace(/,/g, '.').replace(/[^\d.]/g, '')

  // 处理多小数点场景,限制小数位最多2位
  const firstDotIndex = rawVal.indexOf('.')
  if (firstDotIndex !== -1) {
    const integerPart = rawVal.slice(0, firstDotIndex)
    // 移除小数部分多余的小数点,最多保留两位
    const decimalPart = rawVal.slice(firstDotIndex + 1).replace(/\./g, '').slice(0, 2)
    rawVal = decimalPart ? `${integerPart}.${decimalPart}` : integerPart
  }

  // 可选:添加千分位空格,不需要可直接删除以下4行
  const [integer, decimal] = rawVal.split('.')
  const formattedInteger = integer.replace(/\B(?=(\d{3})+$)/g, ' ')
  const finalVal = decimal ? `${formattedInteger}.${decimal}` : formattedInteger
  e.target.value = finalVal

  // 如果不需要千分位,直接赋值 e.target.value = rawVal 即可
}

逻辑说明

  • 完全覆盖需求:自动转换欧洲地区常用的逗号小数分隔符为点,仅允许输入数字,最多保留1个小数点、小数位最多2位
  • 规避了ReDoS风险:提前过滤所有无效字符后再做正则匹配,输入长度和字符范围完全可控,不会触发正则回溯漏洞
  • 逻辑精简可扩展:如果不需要千分位展示,直接删除对应代码块即可,维护成本更低

后端传值处理

提交数据时,只需移除输入值中的所有空格即可获得后端要求的标准格式:

const backendValue = e.target.value.replace(/\s/g, '')

内容的提问来源于stack exchange,提问作者Manzana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:06:05