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





printf("%05d", zipCode);
0 указывает, чем вы заполняете, а 5 показывает ширину целого числа.
Пример 1: Если вы используете "%02d" (полезно для дат), это добавит нули только для чисел в столбце единиц. Например, 06 вместо 6.
Пример 2: "%03d" добавит 2 нуля для одного числа в столбце единиц и 1 ноль для числа в столбце десятков. Например, номер 7 дополнен до 007, а номер 17 дополнен до 017.
Для вашего случая этого будет достаточно. Как можно иметь ведущие нули в целом числе неизвестной длины?
Вам нужно знать максимальную длину последней набитой строки. В качестве альтернативы, если вы всегда хотели 5 ведущих нулей, тогда "00000" + integer.to_s. так далее
printf допускает различные варианты форматирования.
Пример:
printf("leading zeros %05d", 123);
Вы ставите ноль перед минимальной шириной поля:
printf("%05d", zipcode);
Если вы находитесь на машине * nix:
man 3 printf
Откроется страница руководства, похожая на:
0 The value should be zero padded. For d, i, o, u, x, X, a, A, e, E, f, F, g, and G conversions, the converted value is padded on the left with zeros rather than blanks. If the 0 and - flags both appear, the 0 flag is ignored. If a precision is given with a numeric conversion (d, i, o, u, x, and X), the 0 flag is ignored. For other conversions, the behavior is undefined.
Несмотря на то, что вопрос касается C, страница это может помочь.
зачем нужен номер 3?
@Elric Если вы дадите числовой аргумент команде man, она сузит его до этого конкретного раздела. Без него вы получите справочную страницу для команды оболочки printf вместо функции C.
sprintf(mystring, "%05d", myInt);
Здесь «05» означает «использовать 5 цифр с ведущими нулями».
Правильное решение - сохранить почтовый индекс в базе данных как STRING. Несмотря на то, что это может выглядеть как число, это не так. Это код, в котором каждая часть имеет значение.
Число - это то, над чем вы производите арифметические вычисления. Почтовый индекс - это не то.
Я. Ваше наблюдение абсолютно верно. Вот что я делаю. Однако человек, задающий вопрос, вероятно, пытается заниматься домашним заданием, а не производственным кодом. Ответ должен быть адаптирован к человеку, задающему вопрос.
Полагаю, мне следовало перефразировать это более точно, чтобы проиллюстрировать, что я хотел увидеть, как я могу использовать начальные и конечные символы на языке, с которым я не был знаком. В будущем я буду более осторожен с произвольными примерами!
В почтовых индексах других стран, например Великобритании, есть буквы.
Почтовый индекс - это поле с высокой степенью локализации, и многие страны имеют символы в своих почтовых индексах, например, Великобритания, Канада. Следовательно, в этом примере вы должны использовать поле string / varchar для его хранения, если в какой-то момент вы будете отправлять или получать пользователей, клиентов, клиентов и т. д. Из других стран.
Однако в общем случае следует использовать рекомендуемый ответ (printf("%05d", number);).
Вы избавите себя от кучи проблем (в долгосрочной перспективе), если сохраните почтовый индекс в виде символьной строки, а это не число, а это не так.
Если бы только кто-нибудь объяснил, как обнулить массив символов. Существует даже решение, которое использует atoi () для преобразования массива char в init, а затем использует% 05d. Надеюсь, это не единственное решение.
@Niko Ну, я думаю, вы бы использовали memcpy и так далее, чтобы обнулить массив символов. Но зачем вам это делать?
Более гибкий.. Вот пример печати строк выровненных по правому краю чисел с фиксированной шириной и заполнением пробелами.
//---- 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 было более читабельным.
Я не уверен на 100% в вашем намерении с макросом, но похоже, что вы хотели определить функцию, например #define FMT(x) (getFmt(8,x).c_str()) (обратите внимание на параметр Икс!), А не переменную (что и делает ваш код).
Если вам нужно сохранить почтовый индекс в массиве символов zipcode[], вы можете использовать это:
snprintf(zipcode, 6, "%05.5d", atoi(zipcode));
Вывести число с ведущими нулями можно двумя способами:
Использование флага 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|
Отличный ответ, касающийся того факта, что OP печатает целое число со знаком. Форматирование printf - действительно сильная особенность C.Я вообще фанат C++, но когда дело доходит до подобных вещей, я склоняюсь к простому C.
Пожалуйста, не храните почтовые индексы как числа. В почтовых индексах некоторых стран есть буквы.