繁体   English   中英

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

[英]Checking if a given String is a valid currency using number format

我有以下字符串:

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应该有一个优雅的解决方案。 因此,这个问题!

谢谢阅读!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM