货币格式的正则表达式 - java

Regex for currency formatting - java

我想将过滤器添加到我的 EditText 中,接受不同的货币值,例如

美国货币格式:123,456.00

西班牙货币格式:123.456,00

此外,我想保留小数点前最多 10 位和小数点后最多 2 位。

我用于过滤 EditText 值的正则表达式是 (([0-9|(,.)]{0,13})?)?((,.)[0-9]{0,2})?

但是这个正则表达式接受像 ,,,,,,,.......

这样的值

如何更改严格接受具有相同模式的两种货币格式的正则表达式?

感谢任何帮助。先感谢您。

您的模式只能匹配重复的点或重复的逗号,因为由于问号,所有部分都是可选的。它也可以匹配一个空字符串。

您可以将 alternation 与以点或逗号开头后跟 3 或 2 位数字的重复组一起使用,以防止出现连续的点和逗号:

说明

^(?:(?![,0-9]{14})\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|(?![.0-9]{14})\d{1,3}(?:\.\d{3})*(?:\,\d{1,2})?)$
  • ^ 字符串开头
  • (?:非捕获组
    • (?![,0-9]{14}) 否定前瞻,断言逗号或数字不重复 14 次
    • \d{1,3}(?:,\d{3})*(?:\.\d{1,2})? 匹配 1-3 位数字,重复 0+ 次匹配逗号后跟 3 位数字,可选择匹配点和 1-2 位数字
    • |
    • (?![.0-9]{14}) 否定前瞻,断言一个点或数字不重复 12 次
    • \d{1,3}(?:\.\d{3})*(?:\,\d{1,2})? 匹配 1-3 个数字,重复 0+ 次匹配一个点后跟 3 个数字,可选择匹配一个逗号和 1-2 个数字
  • )关闭非捕获组
  • $ 断言字符串结束

Regex demo

NumberFormat's getCurrencyInstance 方法有一个 Locale 参数。这是处理格式化货币问题的标准方法。