我正在尝试将以0开头的int转换为存储在电话簿中的字符串,因为电话号码可以从0开始。
我试过了 -
int num = 0125;
String.format("%04d",num);
和
Integer.toString(num);
和
DecimalFormat df = new DecimalFormat("0000");
df.format(num);
每次我获得输出0085
而不是0125
。
如何将带前导零的int转换为十进制格式的字符串?
答案 0 :(得分:9)
以零开头的int
值被认为是类似于十六进制数的octal number
(数字从0到7)。因此你的价值:
0125
等于: 1 * 8 2 + 2 * 8 1 + 5 * 8 0 == 64 + 16 + 5 == 85
请勿尝试将电话号码表示为int
。而是使用String
并使用正则表达式验证它。如果将两者结合使用,您可以按照自己的类型表示电话号码,如:
public class PhoneNumber {
private final String number;
public PhoneNumber(String number) {
if (number == null || !number.matches("\\d+([-]\\d+)?")) {
throw new .....
}
this.number = number;
}
}
regex
只是一个匹配电话号码的示例:1234
或0123-45678
。
答案 1 :(得分:1)
以0
开头的数字文字被视为八进制(基数为8)。 125 base 8是85 base 10(十进制)。
此外,int i = 09
会因同样的原因抛出编译器错误。
答案 2 :(得分:1)
0125
实际上是85.为什么?
以0开头的数字是八进制数字。所以0125是:
5 * 8 0 + 2 * 8 1 + 1 * 8 2 = 85
请参阅JLS - 3.10.1. Integer Literals:
八进制数字由ASCII数字0后跟一个或多个组成 ASCII数字0到7穿插着下划线,并且可以 表示正整数,零整数或负整数。