【问题标题】:How to validate the Currency String in java如何在java中验证货币字符串
【发布时间】:2015-10-01 12:48:39
【问题描述】:

假设我有一个德语格式的货币字符串:

String money="1.203.432,25";

我想检查金钱是否是有效的货币价值。 “0,00”有效,“134.20,24”无效,“02,23”无效,以此类推。我如何在 Java 中做到这一点?

【问题讨论】:

  • 为什么“02,23”无效?这大约是德国火车站一杯浓缩咖啡的欧元成本。
  • @Bathsheba 这很可能是因为前导零。

标签: java currency currency-formatting


【解决方案1】:

使用本地化数字格式(如果始终为德语格式,则使用正则表达式)。

正则表达式可能类似于^(?:0|[1-9][0-9]{0,2}(?:\.[0-9]{3})*),[0-9]{2}$,使用String#matches()Matcher#matches() 时不需要^$

数字格式可以是DecimalFormat,例如###,##0.00,或者只使用NumberFormat.getInstance( Locale.GERMAN )。然而,数字格式的问题在于它允许数字有前导零,所以如果你想禁止这些,你可以检查第一个数字是否为零。

【讨论】:

  • NumberFormat 不起作用,因为它允许例如前导零 RegExp 应该是,我认为,只是在寻找现在。
  • 看起来像 ^(?:0|[1-9]\d{0,2}(?:\.\d{3})*),\d{2}$诀窍
  • @AlexeiVinogradov 是的,这似乎没问题(我会在答案中添加 0,xx 案例以供其他人发现)。请注意,\d 也允许使用外来数字,因此您可能想改用 [0-9]
【解决方案2】:

也许 Apache CurrencyValidator 是您正在寻找的。​​p>

public static void main (String[] args) throws java.lang.Exception {
     BigDecimalValidator validator = CurrencyValidator.getInstance();

     BigDecimal amount = validator.validate("€ 123,00", Locale.GERMAN);

     if(amount == null){
         System.out.println("Invalid amount/currency.");
     }

}

【讨论】:

  • 你用“023,00€”测试过吗?
  • 接受前导零,因此它不适用于您的情况-对不起。
【解决方案3】:

这个 sn-p 似乎有效:

String money="23.234,00";
Pattern p=Pattern.compile("^(?:0|[1-9]\\d{0,2}(?:\\.\\d{3})*),\\d{2}$");
Matcher m=p.matcher(money);
if (m.matches()) System.out.println("valid");
else System.out.println("unvalid");

【讨论】:

  • 旁注:如果您省略 ^$Matcher.find() 将查找多次出现。使用 Matcher.matches() 会做同样的事情并尝试匹配 整个 输入字符串。
【解决方案4】:

使用以下模式:"([0-9]{1,3}\.)*[0-9]{1,3}\,[0-9]{2}"

System.out.println("11.118.576.587,58".matches("([0-9]{1,3}\\.)*[0-9]{1,3}\\,[0-9]{2}"));

【讨论】:

    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多