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

时间:2014-03-11 06:04:35

标签: java number-formatting

我有以下字符串:

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");
}

UseCase:我正在使用pdfbox解析pdf。鉴于searchterm说“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应该有一个优雅的解决方案。 因此问题!

感谢阅读!

2 个答案:

答案 0 :(得分:3)

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);
}

答案 1 :(得分:0)

您可以尝试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());
}