Integer.valueOf()和Integer.parseInt()的区别

198
除了已经记录在文档中的Integer.parseInt()处理负号外,Integer.valueOf()Integer.parseInt()之间还有其他区别吗?
既然两者都不能将解析为十进制千位分隔符(会产生NumberFormatException),那么是否有已经可用的Java方法可以做到这一点?

1
我们能否得到一个澄清,因为你正在处理整数... 你是想将"1,000,000"转换成值为1000000的int吗?还是像将"123,4"转换成值为123的int? - corsiKa
介意告诉我们哪个整数有小数分隔符吗?---哦,glowcoder已经击败了我 ;) - Philipp Reichart
@glowcoder 是的,将“1,000,000”转换为值为1000000的int正是我想要的。谢谢! - ateiob
那是千位分隔符,不是小数点。 - Karl Knechtel
7
取决于你来自哪里,实际上。 - Adam Keenan
自Java 7以来,如果适用于您的用例,您还可以将100_000编写为100,000。 - yash sachdeva
5个回答

259

实际上,valueOf 内部使用了 parseInt。两者的区别在于,parseInt 返回一个 int 原始类型,而 valueOf 返回一个 Integer 对象。看一下 Integer.class 的源代码:

public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s, 10);
}

public static Integer valueOf(String s, int radix) throws NumberFormatException {
    return Integer.valueOf(parseInt(s, radix));
}

public static Integer valueOf(String s) throws NumberFormatException {
    return Integer.valueOf(parseInt(s, 10));
}

至于使用逗号进行解析,我不熟悉任何一种方法。我会对它们进行清理处理。

int million = Integer.parseInt("1,000,000".replace(",", ""));

1
谢谢。我之前使用的是Integer.valueOf,在从数据库中获取int并尝试将其从String转换为int时出现了NullPointerException。注意,不是从String转换为Integer。我必须改用Integer.parseInt()。 - fIwJlxSzApHEZIl
使用格式化值的方法:million.replace(/,/g, ""); - Dang Thinh

30

第一个问题: Java中parseInt和valueOf的区别是什么?

第二个问题:

NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);
Number number = format.parse("1,234");
double d = number.doubleValue();

第三个问题:

DecimalFormat df = new DecimalFormat();
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator('.');
symbols.setGroupingSeparator(',');
df.setDecimalFormatSymbols(symbols);
df.parse(p);

1
我相信他的意思是解析 "1,000,000" --> (int)1000000,而不是欧洲小数。 - corsiKa
1
如果一个数字有小数部分,为什么他还想解析成整数呢? :-) - corsiKa
2
这就是收集需求时的常态。 :-) - corsiKa
4
@ateiob所说的是“数字分组符”或常称为“千位分隔符”。 - corsiKa
2
@glowcoder 有趣的是,我认为该分隔符的名称并非正式地称为“千位分隔符”,原因很简单,因为存在将数字分组为其他组(即不是3个一组)的语言环境。在Michael Kaplan的博客上可以了解更多相关信息-如果我没记错的话,印度就是一个例子(我认为他们将其分成4个一组?)。因此,“分组分隔符”对于国际受众来说是有意义的 ;) - Voo
显示剩余6条评论

21

Integer.valueOf() 返回一个 整型对象,而 Integer.parseInt() 返回一个 整型基本类型 int


9
这两种方法的区别在于:
  • parseXxx() 返回基本数据类型
  • valueOf() 返回该类型的包装对象引用。

8

parseInt()函数将String解析为int,而valueOf()函数除了将int包装成Integer之外没有任何区别。

如果您想完全控制解析整数,可以查看具有各种区域设置的NumberFormat


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