逗号分隔的货币数值字符串拆分

6
我有一个字符串,其中包含格式化的货币值,例如45,890.00和用逗号分隔的多个值,例如45,890.00,12,345.00,23,765.34,56,908.50 ..
我想提取和处理所有货币值,但无法找出正确的正则表达式。这是我尝试过的内容:
public static void main(String[] args) {
    String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50";
    String regEx = "\\.[0-9]{2}[,]";
    String[] results = currencyValues.split(regEx);
    //System.out.println(Arrays.toString(results));
    for(String res : results) {
        System.out.println(res);
    }
}

这个的输出结果是:
45,890 //removing the decimals as the reg ex is exclusive
12,345
23,765
56,908.50

请问有人能帮我解决这个问题吗?


1
你的意思是想要保留“.00”吗?输入值应该使用更好的分隔符,而不是使用逗号,这会让人感到困惑。 - Raptor
是的,我希望输出中有小数位,但我无法控制输入字符串,它是从外部应用程序中提取的。 - RP-
如果这不是作业的话,也许更有意义的做法是使用 String.split 来分割逗号,并使用 SimpleDecimalFormat 来解析值。这样你就可以控制它是否真的是一个数字,小数点分隔符格式,然后按照你想要的方式格式化该十进制值。 - helios
@helios:使用逗号进行String.split会很困难,因为逗号既用作字段分隔符又用作小数分隔符。 - beny23
@beny23:哎呀!你说的对 :) 我没有足够地注意细节。 - helios
3个回答

11

你需要使用正则表达式的"look behind" (?<=regex),它可以匹配但不会消费:

String regEx = "(?<=\\.[0-9]{2}),";

这是您的测试案例现在可以正常工作:

public static void main(String[] args) {
    String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50";
    String regEx = "(?<=\\.[0-9]{2}),"; // Using the regex with the look-behind
    String[] results = currencyValues.split(regEx);
    for (String res : results) {
        System.out.println(res);
    }
}

输出:

45,890.00
12,345.00
23,765.34
56,908.50

太好了!它可以工作了,只是漏掉了“向后查找”。我马上会接受这个答案。谢谢!! - RP-

4

您还可以使用不同的正则表达式来匹配您正在搜索的模式(然后分隔符就无关紧要了):

 String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50,55.00,345,432.00";
 Pattern pattern = Pattern.compile("(\\d{1,3},)?\\d{1,3}\\.\\d{2}");
 Matcher m = pattern.matcher(currencyValues);
 while (m.find()) {
    System.out.println(m.group());
 }

打印

45,890.00
12,345.00
23,765.34
56,908.50
55.00
345,432.00

正则表达式的解释:

  • \\d 匹配数字
  • \\d{1,3} 匹配 1-3 位数字
  • (\\d{1,3},)? 可选地匹配 1-3 位数字后面跟着一个逗号。
  • \\. 匹配小数点
  • \\d{2} 匹配 2 个数字。

然而,我认为使用逗号作为分隔符可能并不是最好的设计方法,这可能会导致混淆。

编辑:

正如 @tobias_k 指出的那样:\\d{1,3}(,\\d{3})*\\.\\d{2} 将是更好的正则表达式,因为它将正确匹配:

  • 1,000,000,000.00

而且它不会错误地匹配:

  • 1,00.00

我只是想发布相同的答案,但使用不同的正则表达式,即 "\\d{1,3}(,\\d{3})*\\.\\d{2}"。你的正则表达式将无法匹配像 "d,ddd,ddd.dd" 这样的值,但会匹配像 "dd,dd.dd" 这样的内容。 - tobias_k

0
在上述所有解决方案中,它会处理字符串中所有值都是带逗号的十进制值。如果货币值字符串看起来像这样:
String str = "1,123.67aed,34,234.000usd,1234euro";
这里并不是所有的值都是小数。应该有一种方法来确定货币是小数还是整数。

1
尝试通过更多细节来改进您的答案。尝试引用一些问题,以便清楚地回答哪个方面。例如“在所有上述解决方案中”。此外,您正在讨论小数和整数之间的区别,而您的示例不包含数字字符。您可能想参考根据模式格式化的数字。 - azbarcea
(这可能是一个新的问题或对现有答案的评论。)如果您的字符串中的值总是以货币代码结尾,并且您想在输出中保留它们,则可以使用类似于 (?<=[0-9][a-z]{3,4}), 的内容。我们在这里所做的就是尝试查找至少一个数字、3到4个字符和逗号来进行分隔。 - RP-
感谢您对我的回复。在上述字符串(String str = "1,123.67aed,34,234.000usd,1234euro")中,我想要的答案只是数字,不包括货币缩写。 - Zenab Gorach
@ZenabGorach,那么您就不需要向后查找。您只需要使用[0-9][a-z]{3,4},即可。 - RP-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接