Друк провідних 0 у C?


345

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

Я подумав використати будь-які виписки з регістру / якщо потім розібратися, скільки цифр - це число, а потім перетворити його на масив char із додатковими 0 для друку, але я не можу допомогти, але думаю, що може бути спосіб зробити це за допомогою синтаксис формату printf, який ухиляється від мене.

Відповіді:


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

0Вказує на те, що ви оббивка з , а також 5показує довжину цілого числа. Наприклад, якщо ви користуєтесь "%02d"(Корисно для дат), це буде лише нульові знаки для цифр у стовпці, тобто ( 06замість 6). У прикладі 2 "%03d"буде додано 2 нулі на одне число в стовпчику one, а колодка - 1 нуль для числа в колоні з десятками. тобто. (число 7 підкладено до 007та число 17 додано до 017).


237
Будь ласка, не зберігайте поштові індекси як числа. У деяких країнах є поштові індекси.
Сек

1
Для вашого випадку цього було б достатньо. Як можна мати провідні нулі в цілому числу невідомої довжини?
Домінік Мотука

Вам потрібно знати максимальну довжину остаточного прокладеного рядка. Крім того, якщо ви завжди хотіли 5 провідних нулів, тоді "00000" + integer.to_s. тощо
mlambie

160

Правильне рішення - зберігати поштовий індекс у базі даних як STRING. Незважаючи на те, що це може виглядати як число, це не так. Це код, де кожна частина має значення.

Число - це те, на чому ви робите арифметику. Поштовий індекс - це не те.


32
Я. Ваше спостереження абсолютно правильне. Це я і роблю. Однак людина, яка задає питання, ймовірно, намагається мати справу з домашніми завданнями, а не кодом виробництва. Відповідь потрібно відповідати особі, яка задає питання.
EvilTeach

15
Я вважаю, що я повинен був би перефразовувати це більш точно, щоб проілюструвати, що я шукав, щоб побачити, як я можу робити провідних та кінцевих персонажів мовою, з якою я не був знайомий. Я буду більш обережним з довільними прикладами в майбутньому!
zxcv

3
Інші країни, такі як Великобританія, мають поштові листи
jjxtra


16

Поштовий індекс - це дуже локалізоване поле, у багатьох країнах є символи у своїх поштових індексах, наприклад, Великобританія, Канада. Тому в цьому прикладі слід використовувати рядок / варчарне поле, щоб зберігати його, якщо в будь-який момент ви доставлятимете або отримуєте користувачів / клієнтів / клієнтів / тощо з інших країн.

Однак у загальному випадку слід скористатися рекомендованою відповіддю ( printf("%05d", number);).


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

Ви збережете купу проблем (тривалий термін), якщо будете зберігати поштовий індекс як символьний рядок, який він є, а не числом, яке це не є.


Якби хтось пояснив би, як нульовий майданчик масиву символів. Існує навіть рішення, яке використовує atoi () для перетворення масиву char в ініт, а потім використання% 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

Функція та макрос створені таким чином, щоб друковані зображення були більш читабельними.


4
Я не на 100% впевнений у своєму намірі з макросом, але, схоже, ви мали намір визначити функцію, наприклад #define FMT(x) (getFmt(8,x).c_str())(зверніть увагу на параметр x !), На відміну від змінної (що і робить ваш код).
Ponkadoodle

0

Якщо вам потрібно зберегти поштовий індекс в масиві символів zipcode [], ви можете скористатися цим:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.