Я пытаюсь найти хороший способ распечатать ведущие 0, например 01001 для zipcode. Пока номер будет сохранен как 1001, что это хороший способ сделать это?
Я думал об использовании операторов case/, если потом выяснить, сколько цифр число, а затем преобразовать его в массив char с дополнительным 0 для печати, но я не могу не думать, что может быть способ для этого с синтаксисом формата printf, который ускользает от меня.
printf("%05d", zipCode);
Правильное решение - хранить почтовый индекс в базе данных как STRING. Несмотря на то, что он может выглядеть как число, это не так. Это код, где каждая часть имеет смысл.
Число - это то, на что вы делаете арифметику. Почтовый индекс не тот.
Вы устанавливаете ноль перед минимальной шириной поля:
printf("%05d",zipcode);
Zipcode - это сильно локализованное поле, во многих странах есть символы в своих почтовых индексах, например, в Великобритании, Канаде. Поэтому в этом примере вам нужно использовать поле string/varchar для его сохранения, если вы в любой момент отправляете или получаете пользователей/клиентов/клиентов/etc из других стран.
Однако в общем случае вы должны использовать рекомендуемый ответ (printf("%05d", number);
).
sprintf(mystring, "%05d", myInt);
Здесь "05" говорит "используйте 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 игнорируются. Для других преобразований поведение undefined.
Даже если вопрос о C, эта страница может быть полезной.
man
, он сузит ее до этого конкретного раздела. Без этого вы получите страницу руководства для команды оболочки printf
вместо функции C.
printf позволяет использовать различные параметры форматирования.
Пример:
printf("leading zeros %05d", 123);
Вы сохраните себе кучу неприятностей (долгосрочный), если вы сохраните почтовый индекс как строку символов, а не число, которое оно не является.
Если вам нужно сохранить zipcode в zipcode символьного массива [], вы можете использовать это:
snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Более гибкий.. Здесь приведен пример печати строк правомерно обоснованных чисел с фиксированной шириной и пробела.
//---- 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 более читабельны.
#define FMT(x) (getFmt(8,x).c_str())
(обратите внимание на параметр x ! ), в отличие от переменной (что и делает ваш код).