Печать ведущих нулей в C

Я пытаюсь найти хороший способ напечатать начальный 0, например 01001 для почтового индекса . Хотя номер будет храниться как 1001, как это лучше сделать?

Я подумал об использовании операторов case или if, чтобы выяснить, сколько цифр в номере, а затем преобразовать его в массив char с дополнительными 0 для печати, но я не могу не думать, что может быть способ сделать это с помощью printf синтаксис формата, который ускользает от меня.


person zxcv    schedule 30.09.2008    source источник


Ответы (11)


printf("%05d", zipCode);

0 указывает, чем вы заполняете, а 5 показывает ширину целого числа.

Пример 1: Если вы используете "%02d" (полезно для дат), это только добавит нули для чисел в столбце единиц. Например, 06 вместо 6.

Пример 2: "%03d" добавит 2 нуля для одного числа в столбце единиц и добавит 1 ноль для числа в столбце десятков. Например, номер 7 дополняется до 007, а номер 17 - до 017.

person EvilTeach    schedule 30.09.2008
comment
Пожалуйста, не храните почтовые индексы как числа. В почтовых индексах некоторых стран есть буквы. - person Sec; 30.09.2008
comment
В вашем случае этого будет достаточно. Как можно иметь ведущие нули в целом числе неизвестной длины? - person Dominic Motuka; 10.05.2018
comment
Вам нужно знать максимальную длину последней набитой строки. В качестве альтернативы, если вы всегда хотели 5 ведущих нулей, тогда 00000 + integer.to_s. так далее - person mlambie; 04.03.2020

Правильное решение - сохранить почтовый индекс в базе данных как STRING. Несмотря на то, что это может выглядеть как число, это не так. Это код, в котором каждая часть имеет значение.

Число - это то, над чем вы производите арифметические вычисления. Почтовый индекс - это не то.

person James Curran    schedule 30.09.2008
comment
Я. Ваше наблюдение абсолютно верно. Вот что я делаю. Однако человек, задающий вопрос, вероятно, пытается заниматься домашним заданием, а не производственным кодом. Ответ должен быть адаптирован к человеку, задающему вопрос. - person EvilTeach; 30.09.2008
comment
Полагаю, мне следовало перефразировать это более точно, чтобы проиллюстрировать, что я хотел увидеть, как я могу использовать начальные и конечные символы на языке, с которым я не был знаком. В будущем я буду более осторожен с произвольными примерами! - person zxcv; 01.10.2008
comment
В других странах, например в Великобритании, в почтовых индексах есть буквы. - person jjxtra; 07.09.2016

Вы ставите ноль перед минимальной шириной поля:

printf("%05d", zipcode);
person Adam Bellaire    schedule 30.09.2008

sprintf(mystring, "%05d", myInt);

Здесь «05» означает «использовать 5 цифр с ведущими нулями».

person Dan Hewett    schedule 30.09.2008

Если вы находитесь на машине * nix:

man 3 printf

Откроется страница руководства, похожая на:

0 Значение должно быть дополнено нулями. Для преобразований d, i, o, u, x, X, a, A, e, E, f, F, g и G преобразованное значение дополняется слева нулями, а не пробелами. Если появляются оба флага 0 и -, флаг 0 игнорируется. Если точность задается с помощью числового преобразования (d, i, o, u, x и X), флаг 0 игнорируется. Для других преобразований поведение не определено.

Хотя вопрос касается языка C, эта страница может оказаться полезной.

person Paul Tomblin    schedule 30.09.2008
comment
зачем нужен номер 3? - person eri0o; 25.02.2018
comment
@Elric Если вы дадите числовой аргумент команде man, она сузит его до этого конкретного раздела. Без него вы получите справочную страницу для команды оболочки printf вместо функции C. - person Paul Tomblin; 25.02.2018

Почтовый индекс - это поле с высокой степенью локализации, и многие страны имеют символы в своих почтовых индексах, например, Великобритания, Канада. Следовательно, в этом примере вы должны использовать поле string / varchar для его хранения, если в какой-то момент вы будете отправлять или получать пользователей, клиентов, клиентов и т. Д. Из других стран.

Однако в общем случае следует использовать рекомендуемый ответ (printf("%05d", number);).

person JeeBee    schedule 30.09.2008

printf позволяет использовать различные параметры форматирования.

Пример:

printf("leading zeros %05d", 123);
person Trent    schedule 30.09.2008

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

person pro3carp3    schedule 30.09.2008
comment
Если бы только кто-нибудь объяснил, как обнулить массив символов. Существует даже решение, которое использует atoi () для преобразования массива char в init, а затем использует% 05d. Надеюсь, это не единственное решение. - person Niko; 15.01.2019
comment
@Niko Ну, я думаю, вы бы использовали memcpy и так далее, чтобы обнулить массив символов. Но зачем вам это делать? - person OmarL; 18.02.2021

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

Использование флага 0 и спецификатора ширины:

int zipcode = 123;
printf("%05d\n", zipcode);  // Outputs 00123

Используя спецификатор точности:

int zipcode = 123;
printf("%.5d\n", zipcode);  // Outputs 00123

Разница между ними заключается в обработке отрицательных чисел:

printf("%05d\n", -123);  // Outputs -0123 (pad to 5 characters)
printf("%.5d\n", -123);  // Outputs -00123 (pad to 5 digits)

Почтовые индексы вряд ли будут отрицательными, поэтому это не имеет значения.

Однако обратите внимание, что почтовые индексы могут содержать буквы и тире, поэтому их следует хранить в виде строк. Включение начальных нулей в строку очень просто, поэтому проблема решается гораздо проще.

Обратите внимание, что в обоих приведенных выше примерах значения ширины или точности 5 могут быть указаны как аргумент int:

int width = 5;
printf("%0*d\n", width, 123);  // Outputs 00123
printf("%.*d\n", width, 123);  // Outputs 00123

Есть еще одна хитрость: точность 0 не приводит к выводу значения 0:

printf("|%0d|%0d|\n", 0, 1);   // Outputs |0|1|
printf("|%.0d|%.0d|\n", 0, 1); // Outputs ||1|
person chqrlie    schedule 06.02.2021
comment
Отличный ответ, касающийся того факта, что OP печатает целое число со знаком. Форматирование printf - действительно сильная особенность C.Я вообще фанат C ++, но когда дело доходит до подобных вещей, я склонен возвращаться к простому C. - person nielsen; 17.02.2021

Более гибкий .. Вот пример печати строк выровненных по правому краю чисел с фиксированной шириной и отступом.

//---- Header
std::string getFmt ( int wid, long val )
{  
  char buf[64];
  sprintf ( buf, "% *ld", wid, val );
  return buf;
}
#define FMT (getFmt(8,x).c_str())

//---- Put to use
printf ( "      COUNT     USED     FREE\n" );
printf ( "A: %s %s %s\n", FMT(C[0]), FMT(U[0]), FMT(F[0]) );
printf ( "B: %s %s %s\n", FMT(C[1]), FMT(U[1]), FMT(F[1]) );
printf ( "C: %s %s %s\n", FMT(C[2]), FMT(U[2]), FMT(F[2]) );

//-------- Output
      COUNT     USED     FREE
A:      354   148523     3283
B: 54138259 12392759   200391
C:    91239     3281    61423

Функция и макрос спроектированы таким образом, чтобы printfs было более читабельным.

person rch    schedule 19.04.2014
comment
Я не уверен на 100% в ваших намерениях с макросом, но похоже, что вы хотели определить функцию, например #define FMT(x) (getFmt(8,x).c_str()) (обратите внимание на параметр x!), А не переменную (которая является что делает ваш код). - person Ponkadoodle; 02.08.2014

Если вам нужно сохранить почтовый индекс в массиве символов, zipcode[], вы можете использовать это:

snprintf(zipcode, 6, "%05.5d", atoi(zipcode));
person Brad Jennings    schedule 19.06.2015