似乎parseDouble可以接受带有尾随空格的字符串,但是parseInt和parseLong会抛出异常。
e.g。对于此测试用例
@Test
public void testNumberParsing() {
try {
Double.parseDouble("123.0 ");
System.out.println("works");
}catch (NumberFormatException e) {
System.out.println("does not work");
}
try {
Integer.parseInt("123 ");
System.out.println("works");
}catch (NumberFormatException e) {
System.out.println("does not work");
}
try {
Long.parseLong("123 ");
System.out.println("works");
}catch (NumberFormatException e) {
System.out.println("does not work");
}
}
结果
works
does not work
does not work
为什么行为不同?这是故意的吗?
答案 0 :(得分:5)
实际记录了这种行为(虽然这是一个非常糟糕的设计......)!
返回一个初始化为由指定String表示的值的新double,由double类的valueOf方法执行。
s中的前导和尾随空白字符将被忽略。删除空格,就像使用String.trim()方法一样;也就是说,删除了ASCII空格和控制字符。
字符串中的字符必须全部为十进制数字,但第一个字符可能是ASCII减号' - ' (' \ u002D')表示负值或ASCII加号' +' (' \ u002B')表示正值。
答案 1 :(得分:1)
in = in.trim(); // don't fool around with white space.
然而,parseInt
的情况不会发生这种情况。他们只是检查null
并继续进行。
同意你的意见。作者也应该为Integer做同样的事情。
答案 2 :(得分:0)
我认为不是同一个作者,因此从Java API的角度看是不连贯的。 一个人认为你必须处理修剪自己,而另一个人认为这个方法可以为你做。 我不确定我更喜欢哪一个,有时更严格的代码(不那么宽松)会更好。