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

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

304 голосов
/ 30 сентября 2008

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

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

Ответы [ 10 ]

513 голосов
/ 30 сентября 2008
printf("%05d", zipCode);

155 голосов
/ 30 сентября 2008

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

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

44 голосов
/ 30 сентября 2008

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

printf("%05d",zipcode);
16 голосов
/ 30 сентября 2008

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

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

14 голосов
/ 30 сентября 2008

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

13 голосов
/ 30 сентября 2008
sprintf(mystring, "%05d", myInt);

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

7 голосов
/ 30 сентября 2008

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

например:

printf("leading zeros %05d", 123);
3 голосов
/ 30 сентября 2008

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

0 голосов
/ 19 июня 2015

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

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
0 голосов
/ 19 апреля 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...