Когда я пишу System.out.println(0123);
, я получаю 83
, однако System.out.println((int)0123F);
печатает 123
.
Почему это работает?
Когда я пишу System.out.println(0123);
, я получаю 83
, однако System.out.println((int)0123F);
печатает 123
.
Почему это работает?
0123 означает восьмеричную 123, то есть 1 * 8 * 8 + 2 * 8 + 3, что равно 83. По какой-то причине восьмеричные поплавки недоступны.
Создание 0123 означает целое число 83. Создание 0123F означает плавающее 123. При преобразовании обратно в целое число остается 123.
Просто не используйте ведущие 0, если вы не имеете в виду восьмеричные. В конце концов, они не совсем полезны (и программисты, которые знают о восьмеричных числах, будут путаться, когда они видят 09F).
Поскольку целые литералы, начинающиеся с 0
, рассматриваются как восьмеричные числа.
См. раздел 3.10.1 JLS
Попробуйте следующее:
public static String leftPad(int n, int padding) {
return String.format("%0" + padding + "d", n);
}
leftPad(5, 3); // return "005"
leftPad(15, 5); // return "00015"
leftPad(224, 3); // return "224"
leftPad(0, 4); // return "0000"
сначала напечатан как 83, потому что java принимает 0123 как восьмеричное число, и он печатает десятичный эквивалент этого числа.
Октальные (ведущие 0) и шестнадцатеричные (ведущие 0x) были унаследованы от C. Для сравнения попробуйте
System.out.println(0x123);
0123 -> 83
1010L -> 1010
0101L -> 65
Цифры 1010L
и 0101L
не находятся в двоичном представлении (просто чтобы избежать путаницы).
Эти числа представлены в десятичном представлении.
Даже в соответствии с шаблонами Regex в Oracle docs,
\ 0n - символ с восьмеричным значением 0n (0 <= n <= 7)
\ xhh - это символ с шестнадцатеричным значением 0xhh
Таким образом, ваш номер 0101
в формате Integer
или Long
рассматривается как восьмеричное представление числа.
123 => 1 * 8^2 + 2 * 8^1 + 1 * 8^0 = 83
0101 => 1 * 8^2 + 0 * 8^1 + 1 * 8^0 = 64 + 0 + 1 = 65
printf
сделает это: http://java.sun.com/developer/technicalArticles/Programming/sprintf/
public class X
{
public static void main(final String[] argv)
{
System.out.printf("%04d", 123);
System.out.println();
}
}
Вы также можете сделать его "%0" + size + "%d"
, если хотите изменить длину... хотя, если длина была общей, я бы, вероятно, сделал константы, такие как "%04d"
, "%012d"
и т.д.
В Java целые литералы с начальным нулем - это восьмеричные целые числа (база 8).
1 * 8^2 + 2 * 8 + 8 = 83
Поэтому не используйте число, ведущее с 0, если вы не хотите рассматривать его как восьмеричное число.
Любое число с суффиксом "F", тогда оно рассматривается как число с плавающей запятой.
В данном примере (inf)0123F
будет печатать 123
, потому что 0123F, обработанный как float (123) и преобразованный в значение int, остается 123.