【问题标题】:Regex for currency formatting - java用于货币格式化的正则表达式 - java
【发布时间】:2019-04-24 05:52:29
【问题描述】:

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

美国货币格式:123,456.00

西班牙货币格式:123.456,00

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

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

但是这个正则表达式接受 ,,,,,,,....... 之类的值

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

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

【问题讨论】:

    标签: java regex currency-formatting


    【解决方案1】:

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

    您可以将 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 次​​li>
      • \d{1,3}(?:\.\d{3})*(?:\,\d{1,2})? 匹配 1-3 位,重复 0+ 次匹配点后跟 3 位,可选匹配逗号和 1-2 位
    • )关闭非捕获组
    • $断言字符串结束

    Regex demo

    【讨论】:

    • 谢谢,还有一件事,我想保留小数点前最多 10 位,小数点后最多 2 位。如何添加?
    • @第四只鸟,谢谢,但是这个正则表达式将如何匹配 1,234,567,890.89?因为我想要小数点前最多 10 位数字?
    • @Kavita_p 老实说,正则表达式在这里可能不是一个好的选择。虽然可以实现,但很难维护。
    • 负前瞻看起来很奇怪:1,234,567,890 是有效的,它有 13 次重复,您的模式将排除这些重复
    • @AdrianShum 我已经更新了前瞻,并将小数部分设为可选。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,但在这里我想为我的编辑文本字段添加一个过滤器。我不想让用户在编辑文本字段中添加任何值
    • 我很困惑——不是第一次,你也不是第一个注意到你的人——所以请加入我here 并帮助启发我,好吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多