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

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

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

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

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

我是这样做的:

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

关于java - 使用数字格式检查给定字符串是否是有效货币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22317684/

相关文章:

java - 如何使用自定义 deltaTime 函数检查 1 秒是否已过去 [Java]

java - 对象的数组列表只是创建对同一对象java的引用

java - 带有连接的排序数据的 hibernate 分页

Javascript 格式 float

java - 在 Scala 或 Java 中使用 Excel 语法格式化数字

java - 输出该数字以及重复序列的单个字符

java - 在 FMJ 中找不到捕获设备

php - 在数据库 MySQL 中插入格式编号

c++ - std::to_chars() 最小浮点缓冲区大小

matlab - 在matlab中将单元格转换为数组