字符串"008949679851"转Integer抛NumberFormatException的原因及解决
哈哈,这个问题我之前踩过坑!其实不是字符串长度的限制,是Java里Integer类型的取值范围在搞鬼~
为什么会抛出NumberFormatException?
Java的Integer是32位有符号整数,它的取值范围是 -2147483648 到 2147483647。你要转换的字符串"008949679851"去掉前导零后是数字8949679851,这个数远远大于Integer的最大值2147483647,所以Integer.valueOf()会直接抛出异常。
而你去掉前三位后的"949679851"转成数字是949679851,这个数刚好在Integer的范围内,所以能正常转换。
怎么实现完整字符串的正常转换?
根据你的数字大小,有两种方案:
- 使用
Long类型转换Long是64位有符号整数,取值范围是 -9223372036854775808 到 9223372036854775807,你的数字8949679851完全在这个范围内,替换成Long.valueOf()就可以了:
String sku = "008949679851"; System.out.println(Long.valueOf(sku));
- 如果数字超过
Long范围,用BigInteger
如果以后遇到更长的数字(比如超过19位),Long也存不下,这时候可以用java.math.BigInteger,它能处理任意大小的整数:
String sku = "008949679851"; System.out.println(new BigInteger(sku));
另外补充一句:字符串里的前导零不会影响转换结果,不管是Integer、Long还是BigInteger,都会自动忽略前导零,直接解析后面的有效数字。
内容的提问来源于stack exchange,提问作者Qaddaffi
相关产品推荐
相关产品推荐

