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

225

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

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

Теги:
printf

10 ответов

414
Лучший ответ
printf("%05d", zipCode);

  • 201
    Пожалуйста, не храните почтовые индексы в виде чисел. Некоторые страны имеют буквы в своем почтовом индексе.
  • 1
    Для вашего случая этого будет достаточно. Как можно иметь ведущие нули в целом числе неизвестной длины?
130

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

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

  • 25
    Ya. Ваше наблюдение абсолютно верно. Это то, что я делаю. Однако человек, задающий вопрос, вероятно, пытается заниматься домашним заданием, а не рабочим кодом. Ответ должен быть адаптирован к человеку, задающему вопрос.
  • 13
    Полагаю, мне следовало бы перефразировать его более точно, чтобы проиллюстрировать, что я искал, чтобы увидеть, как я могу выполнять начальные и конечные символы на языке, с которым я не был знаком. Я буду более осторожен с произвольными примерами в будущем!
Показать ещё 1 комментарий
42

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

printf("%05d",zipcode);
15

Zipcode - это сильно локализованное поле, во многих странах есть символы в своих почтовых индексах, например, в Великобритании, Канаде. Поэтому в этом примере вам нужно использовать поле string/varchar для его сохранения, если вы в любой момент отправляете или получаете пользователей/клиентов/клиентов/etc из других стран.

Однако в общем случае вы должны использовать рекомендуемый ответ (printf("%05d", number);).

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

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

11

Если вы находитесь на машине * 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, эта страница может быть полезной.

  • 0
    зачем нужен 3 номер?
  • 1
    @Elric Если вы дадите числовой аргумент команде man , он сузит ее до этого конкретного раздела. Без этого вы получите страницу руководства для команды оболочки printf вместо функции C.
7

printf позволяет использовать различные параметры форматирования.

Пример:

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

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

  • 0
    Если бы только кто-нибудь объяснил, как обнулить массив символов. Существует даже решение, которое использует atoi () для преобразования массива char в init, а затем использует% 05d. Надеюсь, что это не единственное решение.
0

Если вам нужно сохранить zipcode в zipcode символьного массива [], вы можете использовать это:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
0

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

//---- 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 более читабельны.

  • 3
    Я не уверен на 100% в вашем намерении с макросом, но похоже, что вы намеревались определить функцию, например #define FMT(x) (getFmt(8,x).c_str()) (обратите внимание на параметр x ! ), в отличие от переменной (что и делает ваш код).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню