【问题标题】:Regular expression for processing European numbers and vice versa用于处理欧洲数字的正则表达式,反之亦然
【发布时间】:2021-05-04 12:54:18
【问题描述】:

我试图在我的应用程序中找到一种处理欧洲数字的简单方法,但结果比我想象的要复杂。根据欧洲的数字格式,千位分隔符用句点(.)表示,小数位用逗号(,)表示,Javascript中的数字运算符会混淆,并尝试将1000(写为1.000)解释为1,而欧洲人的用户对正则数字表达式感到困惑......目前我正在使用一个简单的正则表达式从数字中删除句点,以便正确呈现

(/\./g, '')

但正如您可以想象的那样,此解决方案仅在没有小数位时才有效。什么是删除任何千位分隔符的正则表达式,如果它们存在,并且如果最后两位数字前面有分隔符,请将其替换为小数分隔符,然后将数字转换并显示给用户原来的格式?

【问题讨论】:

  • 你能提供一个最小的可重现的例子吗?
  • 比如(/\./g, '')后面的5.000会被当作5000处理,但是5000,98同样的表达式会报错。要将 5000 转换回 5.000,我可以使用 .replace(/\B(?=(\d{3})+(?!\d))/g, ".") 之类的表达式,但同样,什么也不会发生在小数上
  • 你怎么知道 5000 等于 5.000 而不是 50,00 ??
  • 这也是问题所在。基本上,只要欧洲用户遵循欧洲惯例并且不放置任何千位分隔符,或者使用句点作为分隔符并且只输入整数,数字就会正确显示,但做其他任何事情都会立即导致数字被误解.

标签: javascript regular-language


【解决方案1】:

如果该样式一致,您可以将点映射到空字符串,将逗号映射到十进制值,例如:

const values = ['5000,98', '5.000']

const parseEuropeanNumber = string => Number.parseFloat(string.replace('.', '').replace(',', '.'))

const parsedValues = values.map(parseEuropeanNumber)

console.log(parsedValues)
>>> [ 5000.98,5000 ]

const sum = parsedValues.reduce((acc, currentVal) => acc + currentVal, 0)

console.log(sum)
>>> 10000.98

【讨论】:

  • 谢谢。我稍微修改了这个想法,因为我意识到我所要做的就是切换逗号和句点,然后删除句点进行渲染。要为计算机格式化它:.replace(/[,.]/g, function (x) { return x == "," ? "." : ""; }),然后将其切换回给最终用户: .replace('.', ',').replace(/\B(?=(\d{3})+(?!\d))/g, ".")
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2021-04-05
  • 2015-08-28
  • 1970-01-01
  • 2012-12-19
相关资源
最近更新 更多