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

345

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

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

zxcv
источник

Ответы:

568
printf("%05d", zipCode);

0Указывает на то, что вы обивка с , а также 5показывает длину целого числа. Например, если вы используете "%02d"(Полезно для дат), это будет заполнять нулями только цифры в столбце единиц, т. Е. ( 06Вместо 6). В примере 2 "%03d"заполняются 2 нуля для одного числа в столбце единиц и 1 для нуля для числа в столбце десятков. то есть. (№ 7 дополняется до 007и № 17 дополняется 017).

EvilTeach
источник
238
Пожалуйста, не храните почтовые индексы в виде чисел. Некоторые страны имеют буквы в своем почтовом индексе.
Sec
1
Для вашего случая этого будет достаточно. Как можно иметь ведущие нули в целом числе неизвестной длины?
Доминик Мотука
Вам нужно знать максимальную длину финальной строки. В качестве альтернативы, если вы всегда хотели 5 ведущих нулей, тогда «00000» + integer.to_s. и т.д.
Мламби
160

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

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

Джеймс Керран
источник
32
Ya. Ваше наблюдение абсолютно верно. Это то, что я делаю. Однако человек, задающий вопрос, вероятно, пытается заниматься домашним заданием, а не рабочим кодом. Ответ должен быть адаптирован к человеку, задающему вопрос.
EvilTeach
15
Полагаю, мне следовало бы перефразировать его более точно, чтобы проиллюстрировать, что я искал, чтобы увидеть, как я могу выполнять начальные и конечные символы на языке, с которым я не был знаком. Я буду более осторожен с произвольными примерами в будущем!
zxcv
3
В других странах, таких как Великобритания, есть буквы в почтовых индексах
jjxtra
47

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

printf("%05d",zipcode);
Адам Беллер
источник
16

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

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

JeeBee
источник
16

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

Пол Томблин
источник
1
зачем нужен 3 номер?
eri0o
4
@Elric Если вы дадите manкоманде числовой аргумент , она сузится до этого конкретного раздела. Без этого вы получите man-страницу для команды оболочки printfвместо функции C.
Пол Томблин
14
sprintf(mystring, "%05d", myInt);

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

Дэн Хьюитт
источник
6

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

например:

printf("leading zeros %05d", 123);
Трент
источник
3

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

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

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

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

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Брэд Дженнингс
источник