Вопрос

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

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

Это было полезно?

Решение

printf("%05d", zipCode);

Другие советы

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

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

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

printf("%05d",zipcode);

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

Однако в общем случае вам следует использовать рекомендуемый ответ (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 допускает различные параметры форматирования.

бывший:

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

Функция и макрос разработаны таким образом, чтобы файлы printf были более удобочитаемыми.

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

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top