Java 按逗号拆分的货币值字符串

Java 按逗号拆分的货币值字符串,java,string-split,Java,String Split,我有一个字符串,其中包含格式化的货币值,如45890.00,以及多个用逗号分隔的值,如45890.00,12345.00,23765.34,56908.50 我想提取和处理所有的货币值,但无法找到正确的正则表达式,这就是我所尝试的 public static void main(String[] args) { String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50"; String regEx = "\\

我有一个字符串,其中包含格式化的货币值,如
45890.00
,以及多个用逗号分隔的值,如
45890.00,12345.00,23765.34,56908.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

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

您需要一个regex“look behind”
(?您也可以使用不同的正则表达式来匹配您正在搜索的模式(那么分隔符是什么其实并不重要):

印刷品

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}
    匹配两位数字
然而,我还要说,使用逗号作为分隔符可能不是最好的设计,可能会导致混淆

编辑:

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

  • 100000000.00
而且它不会错误地匹配:

  • 1,00.00

在上述所有解决方案中,如果字符串中的所有值都是带逗号的十进制值,则需要注意。如果货币值字符串如下所示:

String str=“1123.67aed,34234.000美元,1234欧元”


这里并不是所有的值都是小数。应该有一种方法来确定货币是十进制还是整数。

你的意思是你想让
.00
返回吗?输入值应该使用更好的分隔符,而不是逗号,这很混乱。是的。我想在输出中返回小数,我无法控制输入环,它是从外部应用程序输入的。如果它不是家庭作业,可能更有意义,所以使用
String.split
作为逗号,并使用
SimpleDecimalFormat
来解析值。使用它,您可以控制它实际上是一个数字,十进制分隔符格式,然后按照您想要的方式格式化该十进制值。@helios:Using
String.split
使用逗号将很困难,因为逗号同时用作字段分隔符和小数分隔符。@beny23:哎哟!你说得对:)我没有对细节给予足够的重视。太好了!它起作用了,错过了“回头看”。我会马上接受答案。谢谢只是想发布相同的答案,但使用不同的正则表达式,即
“\\d{1,3}(,\\d{3})*\\.\\d{2}”
。您的将无法匹配诸如“d,ddd,ddd.dd”之类的值,但将匹配诸如“dd,dd.dd”之类的内容。请尝试用更多细节改进您的答案。试着从问题中引用一点,这样就可以清楚地知道你在回答哪方面的问题。如“在上述所有解决方案中”。此外,您正在讨论小数和整数,并且您的示例不包含数字字符。您可能希望根据架构引用格式化的数字。(这可能是一个新问题或对现有答案的注释。)如果您的字符串总是在值的末尾有货币代码,并且希望在输出中保留它们,您可以使用类似
(?谢谢你回复我。我想在上面的字符串(string str=“1123.67aed,34234.000usd,1234euro“)中找到的答案只是没有货币缩写的数字。@ZenabGorach那么你就不需要回头看了。你只需要
[0-9][a-z]{3,4},
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
 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