Запретить изменение Int с 012345 на 5349

Возможный дубликат:
целое число с ведущими нулями

Программа, которую я пишу, требует, чтобы я пометил элемент инвентарным номером 012345 и сохранил его в переменной типа int.

Это урезанный пример того, что я делаю:

int test = 012345;
System.out.println(test);

это печатает как:

5349

Как мне заставить его распечатать как 012345, а не 5349?

РЕДАКТИРОВАТЬ: я ввожу это в параметр конструктора для пользовательского класса, который я инициализирую. Затем я использую метод, чтобы вернуть текущее число, а затем вывести его в окно терминала.


person Matt Grixti    schedule 13.11.2012    source источник
comment
012345 литерал заставляет Java видеть ваше 10-предполагаемое базовое число как 8-базовое (восьмеричное) из-за префикса 0.   -  person Breaking not so bad    schedule 13.11.2012


Ответы (3)


Вы получаете неправильное число, потому что, когда вы добавляете ноль перед целочисленным литералом, Java интерпретирует число как константу восьмеричное (т.е. с основанием 8). Если вы хотите добавить начальный ноль, используйте

int test = 12345;
System.out.println("0"+test);

Вы также можете использовать функции форматированного вывода со спецификатором %06d, так:

System.out.format("%06d", num);

6 означает "использовать шесть цифр"; «0» означает «дополнить нулями, если необходимо».

person Sergey Kalinichenko    schedule 13.11.2012
comment
+1. Очень неожиданное поведение. Но не только Java делает это. - person Thilo; 13.11.2012
comment
@Thilo afaik, почти все языки интерпретируют int с начальным нулем как восьмеричное число. - person ksg91; 13.11.2012
comment
@Thilo Это поведение заимствовано из C. Octal был популярной базой в PDP-11, потому что их машинный код использовал группы из трех битов для обозначения номеров регистров и других частей инструкции. - person Sergey Kalinichenko; 13.11.2012
comment
@dasblinkenlight Это работает, спасибо! Хотя не уверен, что это то, что ожидается. Я добавил дополнительную информацию к моему вопросу, чтобы уточнить. Не могли бы вы сообщить мне, есть ли другая работа, которую вы можете придумать? Спасибо - person Matt Grixti; 13.11.2012
comment
@MattGrixti Взгляните на альтернативу, в которой используется format. - person Sergey Kalinichenko; 13.11.2012

Как уже было сказано, значение int с ведущим нулем считается восьмеричным значением. Если вам не нужно иметь test как int, почему бы не сделать его строковым? Нравиться

String test= new String("012345");

И если вы хотите использовать int для теста, вы можете не добавлять 0, а просто использовать число и добавлять 0 во время печати.

В случае, если вам интересно, как узнать, сколько начальных нулей нужно добавить в начало, вы можете сделать так:

int lengthOfItemID=6;
int test=12345;
String test1=new String("000000"+test);
System.out.println(test1.substring(test1.length()-lengthOfItemID));

Прошу прощения за синтаксические ошибки, последние годы я работал с java.

person ksg91    schedule 13.11.2012
comment
Пожалуйста, убедитесь, что код компилируется, прежде чем публиковать его в качестве ответа. - person Bhesh Gurung; 13.11.2012

Вы можете получить правильный результат, используя Integer.parseInt. Это превратит вашу строку в десятичную строку. (найдено здесь). JAVA API здесь утверждает, что принимает строку и возвращает десятичное число со знаком.

person Snakes and Coffee    schedule 13.11.2012