使用数字格式检查给定字符串是不是为有效货币

Posted

技术标签:

【中文标题】使用数字格式检查给定字符串是不是为有效货币【英文标题】:Checking if a given String is a valid currency using number format使用数字格式检查给定字符串是否为有效货币 【发布时间】:2014-03-11 06:04:35 【问题描述】:

我有以下字符串:

String str1 = "$123.00";
String str2 = "$(123.05)";
String str3 = "incorrectString";

我想检查并输出如下:

if(str1 is a valid currency)
     System.out.println("Str1 Valid");
else
      System.out.println("Str1 InValid");


if(str2 is a valid currency)
     System.out.println("Str2 Valid");
else
      System.out.println("Str2 InValid");


if(str3 is a valid currency)
     System.out.println("Str3 Valid");
else
      System.out.println("Str3 InValid");

用例: 我正在使用 pdfbox 解析 pdf。给定一个搜索词“abc”,我想在搜索词之后阅读下一个标记。为此,我在解析的 pdf 文本中搜索搜索词,然后读取该搜索词的下一个标记。

令牌应该是有效的货币。但是可能存在这样一种情况,即“abc”出现在页面的两个不同位置,一个旁边有有效的货币令牌,而另一个没有。

所以我想检查一下,如果我正在读取的令牌不是有效的货币令牌,请中断循环并继续在页面上搜索。

我是这样做的:

if (tokenRead.length() > 0) 
   String temp = tokenRead.replace("$", "").replaceAll("\\(", "");
   char checkFirstChar = temp.trim().charAt(0);
   if (!(checkFirstChar >= '0' && checkFirstChar <= '9')) 
          System.out.println("breaking");
          break;
    
 

这可行,但我相信应该有一个使用NumberFormat 的优雅解决方案。 所以问题来了!

感谢阅读!

【问题讨论】:

您认为使用正则表达式的答案是您问题的有效答案吗?在我看来,这是显而易见的方法。 【参考方案1】:

NumberFormat 对您的用例没有任何开箱即用的功能。

我能想到的一个可能的解决方案是:

Currency currency = Currency.getInstance(currentLocale);
String symbol = currency.getSymbol();
if(string.startsWith(symbol) || string.endsWith(symbol))
    System.out.println("valid");
else
    System.out.println("invalid");

但是你仍然需要检查字符串的其余部分是否可以解析为数字。

因此我建议看看 Apache Commons Currency Validator,它可能适合您的需求:

@Test
public void test() 
    BigDecimalValidator validator = CurrencyValidator.getInstance();

    BigDecimal amount = validator.validate("$123.00", Locale.US);
    assertNotNull(amount);

    //remove the brackets since this is something unusual
    String in = "$(123.00)".replaceAll("\\(", "").replace(')', ' ').trim();
    amount = validator.validate(in, Locale.US);
    assertNotNull(amount);

    amount = validator.validate("invalid", Locale.US);
    assertNull(amount);

【讨论】:

如果你的代码无效,getInstance()会抛出IllegalArgumentException “无效”是什么意思?简短的解释会很有帮助。【参考方案2】:

你可以试试DecimalFormat。它允许您使用; 分别处理正值和负值模式:

List<String> list = new ArrayList<>();
list.add("$123.00");
list.add("$(123.05)");
list.add("incorrectString");

NumberFormat nf = new DecimalFormat("¤#.00;¤(#.00)", new DecimalFormatSymbols(Locale.US));
try 
    for(String str : list)
        nf.parse(str);
    
 catch (ParseException e) 
    System.out.println(e.getMessage());

【讨论】:

以上是关于使用数字格式检查给定字符串是不是为有效货币的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是为有效数字的逻辑[重复]

求ASP字符串转数字格式?

检查字符串是不是是十六进制数的有效表示

在 php 中检查给定字符串/数字中 coma 的有效性

Nodejs检查给定的字符串是不是是有效的文件系统路径而不实际检查文件系统

给定一个数字,检查数字是不是形成一个加法方程?