C için önde gelen 0'ları mı yazdırıyorsunuz?


345

Ben 01001 gibi bir posta kodu için önde gelen 0, yazdırmak için iyi bir yol bulmaya çalışıyorum. Sayı 1001 olarak saklanırken, bunu yapmanın iyi bir yolu nedir?

Ben her iki durum ifadeleri kullanarak düşündüm / sonra sayı kaç basamak olduğunu anlamak ve daha sonra baskı için ekstra 0 ile bir char dizisine dönüştürmek için ama ben yardımcı olamaz ama bunu yapmak için bir yol olabilir düşünüyorum beni atlayan printf biçimi sözdizimi.

Yanıtlar:


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

0Birlikte doldurma ve ne gösterir 5yakalanan görünen tamsayı numarasının uzunluğunu. Örneğin kullanırsanız "%02d"(tarihlerde Faydalı) Bu olurdu sadece ped olanlar sütununda yani Rakamların sıfırlar. ( 06Yerine 6). Örnek 2, "%03d"birler sütununda bir sayı için 2 sıfır ve onlarca sütunda bir sayı için 1 sıfır pad'i. yani. (7 numaralı yastıklı 007ve 17 numaralı yastıklı 017).


237
Lütfen posta kodlarını numara olarak saklamayın. Bazı ülkelerde posta kodlarında harfler bulunur.
Sn

1
Sizin durumunuz için bu yeterli olacaktır. Bilinmeyen uzunlukta bir tamsayıda baştaki sıfırlar nasıl olabilir?
Dominic Motuka

Son dolgulu dizenin maksimum uzunluğunu bilmeniz gerekir. Alternatif olarak, her zaman 5 önde gelen sıfır istiyorsanız, "00000" + integer.to_s. vb
mlambie

160

Doğru çözüm, posta kodunu STRING olarak veritabanında saklamaktır. Bir sayı gibi görünmesine rağmen, öyle değil. Her parçanın bir anlamı olduğu bir kod.

Sayı, aritmetik yaptığınız bir şeydir. Posta kodu bu değildir.


32
Ya. Gözleminiz kesinlikle doğrudur. Benim yaptığım budur. Ancak soruyu soran kişi, muhtemelen üretim kodu yerine ödevle uğraşmaya çalışıyor. Cevap, soruyu soran kişiye göre ayarlanmalıdır.
EvilTeach

15
Sanırım tanımadığım bir dilde nasıl baş ve son karakterler yapabileceğimi görmek istediğimi göstermek için daha doğru bir şekilde ifade etmiş olmalıydım. Gelecekte keyfi örneklerle daha dikkatli olacağım!
zxcv

3
İngiltere gibi diğer ülkelerde posta kodlarında harfler var
jjxtra

47

Minimum alan genişliğinden önce sıfır yerleştirirsiniz:

printf("%05d",zipcode);

16

Posta kodu oldukça yerel bir alandır, birçok ülkede posta kodlarında örneğin İngiltere, Kanada gibi karakterler bulunur. Bu nedenle, bu örnekte, herhangi bir noktada gönderiyorsanız veya diğer ülkelerden kullanıcılar / müşteriler / müşteriler / vb.

Ancak genel durumda önerilen cevabı ( printf("%05d", number);) kullanmalısınız.


16

* NIX Makinesindeyseniz:

man 3 printf

Bu, aşağıdakine benzer manuel bir sayfa gösterir:

0 Değer sıfır dolgulu olmalıdır. D, i, o, u, x, X, a, A, e, E, f, F, g ve G dönüşümleri için, dönüştürülen değer, boşluklardan ziyade sıfırlarla doldurulur. 0 ve - bayraklarının her ikisi de görünürse, 0 bayrağı yok sayılır. Sayısal dönüştürmeyle (d, i, o, u, x ve X) bir kesinlik verilirse, 0 bayrağı yok sayılır. Diğer dönüşümler için davranış tanımsızdır.

Soru C ile ilgili olmasına rağmen, bu sayfa yardımcı olabilir.


1
3 numara neden gerekli?
eri0o

4
@Elric Komuta sayısal bir bağımsız değişken verirseniz man, onu söz konusu bölüme daraltır. Bu olmadan printf, C işlevi yerine shell komutunun man sayfasını alırsınız .
Paul Tomblin

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

Burada, "05", "baştaki sıfırlarla 5 basamak kullanın" diyor.


6

printf çeşitli biçimlendirme seçeneklerine izin verir.

örn:

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

3

Bir posta kodunu karakter dizesi olarak saklarsanız, bir sayı yerine değil, bir sorun yığını (uzun vadeli) kaydedersiniz.


Keşke bir karakter dizisinin nasıl sıfırlanacağını açıklarsa. Char dizisini bir init'e dönüştürmek ve sonra% 05d kullanmak için atoi () kullanan bir çözüm bile vardır. Umarım bu tek çözüm değildir.
Niko

0

Daha esnek .. İşte sabit genişliklerde ve boşluk dolgulu sağa yaslanmış sayıların satırlarını gösteren bir örnek.

//---- 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

İşlev ve makro, printfs daha okunabilir olacak şekilde tasarlanmıştır.


4
Makro ile niyetinizi% 100 emin değilim, ama bir değişken tanımlamak gibi görünüyor #define FMT(x) (getFmt(8,x).c_str())(not x parametresi!), Bir değişken (kodunuzun ne yaptığıdır) aksine.
Ponkadoodle

0

Posta kodunu bir karakter dizisi posta kodunda [] saklamanız gerekirse, bunu kullanabilirsiniz:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.