Печать, ведущая 0 в C?
Я пытаюсь найти хороший способ распечатать ведущие 0, например 01001 для zipcode. Пока номер будет сохранен как 1001, что это хороший способ сделать это?
Я думал об использовании операторов case/, если потом выяснить, сколько цифр число, а затем преобразовать его в массив char с дополнительным 0 для печати, но я не могу не думать, что может быть способ для этого с синтаксисом формата printf, который ускользает от меня.
Ответы
Ответ 1
printf("%05d", zipCode);
0
указывает, с чем вы дополняете, а 5
показывает длину целого числа. Например, если вы используете "%02d"
(полезно для дат), это будет заполнять нулями только цифры в столбце единиц, т.е. (06
вместо 6
). В примере 2 "%03d"
заполняет 2 нуля для одного числа в столбце единиц и заполняет 1 нулем для числа в столбце десятков. то есть. (номер 7 дополняется до 007
и номер 17 дополняется до 017
).
Ответ 2
Правильное решение - хранить почтовый индекс в базе данных как STRING. Несмотря на то, что он может выглядеть как число, это не так. Это код, где каждая часть имеет смысл.
Число - это то, на что вы делаете арифметику. Почтовый индекс не тот.
Ответ 3
Вы устанавливаете ноль перед минимальной шириной поля:
printf("%05d",zipcode);
Ответ 4
Zipcode - это сильно локализованное поле, во многих странах есть символы в своих почтовых индексах, например, в Великобритании, Канаде. Поэтому в этом примере вам нужно использовать поле string/varchar для его сохранения, если вы в любой момент отправляете или получаете пользователей/клиентов/клиентов/etc из других стран.
Однако в общем случае вы должны использовать рекомендуемый ответ (printf("%05d", number);
).
Ответ 5
Если вы работаете на компьютере * 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, эта страница может оказаться полезной.
Ответ 6
sprintf(mystring, "%05d", myInt);
Здесь "05" говорит "используйте 5 цифр с ведущими нулями".
Ответ 7
printf позволяет использовать различные параметры форматирования.
Пример:
printf("leading zeros %05d", 123);
Ответ 8
Вы сохраните себе кучу неприятностей (долгосрочный), если вы сохраните почтовый индекс как строку символов, а не число, которое оно не является.
Ответ 9
Более гибкий..
Здесь приведен пример печати строк правомерно обоснованных чисел с фиксированной шириной и пробела.
//---- 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 более читабельны.
Ответ 10
Если вам нужно сохранить zipcode в zipcode символьного массива [], вы можете использовать это:
snprintf( zipcode, 6, "%05.5d", atoi(zipcode));