Печать, ведущая 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));