如何在Java中将包含逗号的数字字符串解析为整数?

44

当我试图使用Integer.parseInt()解析265,858时,出现了NumberFormatException错误。

有没有什么方法可以将它解析成整数?


5
问题不够清楚,逗号是千位分隔符还是小数点? - Olivier Refalo
5
我认为它是... 有没有办法将它解析为一个整数? - Bharat Sinha
1
还是以CSV格式为准的2个整数?265和858? - John Gardner
5
“an integer” 不是指两个整数,而是一个整数。 - Marko Topolnik
2
@vivek_jonam,我编辑之前原标题有些混淆。在计算机科学中,“逗号分隔”这个术语有着特殊的含义。当人们看到“逗号分隔”时,他们期望处理由逗号分隔的值列表,而不是一个使用逗号进行分组的单一值。 - Tim Bender
显示剩余4条评论
7个回答

85

这个逗号是十进制分隔符还是两个数字?如果是前者,则必须向使用逗号作为十进制分隔符的NumberFormat类提供Locale

NumberFormat.getNumberInstance(Locale.FRANCE).parse("265,858")

这将得到 265.858。但是使用美国本地化格式,你将得到 265858

NumberFormat.getNumberInstance(java.util.Locale.US).parse("265,858")

这是因为在法国中,逗号被视为小数分隔符,而在美国则被视为千位分隔符。

如果这是两个数字,请使用String.split()将它们拆分成两个单独的字符串,并独立解析每个字符串。


3
“parse it into an integer” 的意思基本上就是将其解析为一个整数 :) - Marko Topolnik
4
第三个选项:它是一个分组分隔符。 - Jon Skeet
是的:一个整数,千位分隔符。 - Marko Topolnik
@MarkoTopolnik:谢谢,我澄清了并添加了更多的例子。确实OP想要解析整数 - 我错过了这一点。 - Tomasz Nurkiewicz
有没有一种通用的方法来做到这一点?毕竟,用户可能从使用与应用程序不同的Locale的某个地方复制了数字。 - AndroidKotlinNoob
显示剩余2条评论

22

在将其解析为整数之前,您可以删除,

int i = Integer.parseInt(myNumberString.replaceAll(",", ""));

请注意,replaceAll 被使用时,对于任何大于 999,999 的数字都是至关重要的。这也消除了从其他答案中抛出/捕获已检查异常的需要。 - Graham Russell

13
如果您想要移除分隔符并且处理的数字是单个数字,NumberFormat可以将其返回给您。在使用getNumberInstance方法时,请确保使用正确的Locale。
例如,某些区域设置会交换逗号和小数点的位置,与您习惯的不同。
然后使用intValue方法返回一个整数。但是,为了解析异常,您需要将整个内容包装在try/catch块中。
try {
    NumberFormat ukFormat = NumberFormat.getNumberInstance(Locale.UK);
    ukFormat.parse("265,858").intValue();
} catch(ParseException e) {
    //Handle exception
}

5

一种选择是去掉逗号:

"265,858".replaceAll(",","");

1
更简单、更快的解决方案:使用 replace 替代 replaceAll - Marko Topolnik

4
假设这是一个单独的数字,对我来说最先想到的是...
String number = "265,858";
number.replaceAll(",","");
Integer num = Integer.parseInt(number);

2

0

试试这个:

String x = "265,858 ";
    x = x.split(",")[0];
    System.out.println(Integer.parseInt(x));

编辑: 如果你想要它四舍五入到最近的整数:

    String x = "265,858 ";
    x = x.replaceAll(",",".");
    System.out.println(Math.round(Double.parseDouble(x)));

1
那应该是265,他不想四舍五入或其他任何操作。 - SpiXel
但是数字是 265858 或者 265.858 - Cratylus
1
如果您阅读 OP 的问题,您不知道数字是 265 还是 265858。即使是 265,也可能 OP 需要它作为 266。 - Luiggi Mendoza
这个问题与四舍五入、浮点数或十进制数没有任何关系。逗号只是一个千位分隔符,它需要的处理就是忽略它。 - Marko Topolnik
2
加油,他只需要使用replaceAll部分,我只是举了一个例子,可以进行一些微调或其他操作! - SpiXel

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