Печать ведущих 0 в C?
Я пытаюсь найти хороший способ распечатать ведущие 0, такие как 01001 для zipcode. Хотя число будет храниться как 1001, что это хороший способ сделать это?
Я думал об использовании операторов case / if, чтобы выяснить, сколько цифр число, а затем преобразовать его в массив символов с дополнительными 0 для печати, но я не могу не думать, что может быть способ сделать это с синтаксисом формата printf, который ускользает от меня.
10 ответов
правильным решением является сохранение почтового индекса в базе данных в виде строки. Несмотря на то, что это может выглядеть как число, это не так. Это код, в котором каждая часть имеет значение.
число-это то, на чем вы делаете арифметику. Почтовый индекс-это не то.
Zipcode является высоко локализованным полем, многие страны имеют символы в своих почтовых кодах, например, Великобритания, Канада. Поэтому в этом примере вы должны использовать поле string / varchar для его хранения, если в любой момент Вы отправляете или получаете пользователей/клиентов/клиентов/и т. д. из других стран.
однако в общем случае вы должны использовать рекомендуемый ответ (printf("%05d", number);
).
Если вы находитесь на машине *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, этой страница может помочь.
вы избавите себя от кучи проблем (в долгосрочной перспективе), если вы храните почтовый индекс как символьную строку, которой он является, а не число, которым он не является.
более гибким.. Вот пример печати строк правильных чисел с фиксированной шириной и заполнением пробелов.
//---- 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 были более читаемыми.
Если вам нужно сохранить zipcode в массиве символов zipcode [], вы можете использовать это:
snprintf( zipcode, 6, "%05.5d", atoi(zipcode));