Печать ведущих 0 в C?

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

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

10 ответов


printf("%05d", zipCode);


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

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


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

printf("%05d",zipcode);

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, этой страница может помочь.


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

здесь " 05 "говорит"использовать 5 цифр с ведущими нулями".


функции printf позволяет различные параметры форматирования.

ex:

printf("leading zeros %05d", 123);

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


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

//---- 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));