【问题标题】:Convert int which start with leading zero to string将以前导零开头的 int 转换为字符串
【发布时间】:2014-04-30 13:05:21
【问题描述】:

我正在尝试将以 0 开头的 int 转换为要存储在电话目录中的字符串,因为电话号码可以以 0 开头。

我试过了-

int num = 0125;
String.format("%04d",num);

Integer.toString(num);

DecimalFormat df = new DecimalFormat("0000");
df.format(num);

每次我得到输出 0085 而不是 0125

如何将带前导零的 int 转换为十进制格式的字符串?

【问题讨论】:

  • 没有以零开头的int。数字是八进制
  • 电话“号码”不是数字,而是单词。使用字符串类来保存它(或特殊用途的 PhoneNumber 类)

标签: java


【解决方案1】:

以零开头的int 值被视为类似于十六进制数字的octal number(数字从0 到7)。因此你的价值:

0125

等于:1 * 82 + 2 * 81 + 5 * 80 == 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 只是匹配电话号码的示例,例如:12340123-45678

【讨论】:

    【解决方案2】:

    0 开头的数字文字被认为是八进制(以8 为底)。 125 base 8 是 85 base 10(十进制)。

    另外,int i = 09 也会出于同样的原因引发编译器错误。

    09 is not recognized where as 9 is recognized

    【讨论】:

      【解决方案3】:

      0125 实际上是 85。为什么?

      以 0 开头的数字是 八进制 数字。所以 0125 是:

      5*80 + 2*81 + 1*82 = 85

      JLS - 3.10.1. Integer Literals

      八进制数字由 ASCII 数字 0 后跟一个或多个 ASCII 数字 0 到 7 之间穿插下划线,并且可以 表示正整数、零整数或负整数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-30
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        相关资源
        最近更新 更多