2008-09-30 4 views
236

우편 번호의 경우 01001과 같이 앞에 오는 0을 인쇄하는 좋은 방법을 찾으려고합니다. 번호는 1001로 저장되지만, 좋은 방법은 무엇입니까?C로 시작하는 0을 인쇄 중입니까?

나는 어느 case 문을 사용할지 생각해 보았다. 숫자가 몇 자리인지 파악한 다음 인쇄를 위해 여분의 0이있는 문자 배열로 변환하지만 도움이되지만 생각할 수는 없다고 생각합니다. 나를 빠져 나가는 printf 형식 구문으로이 작업을 수행하십시오.

답변

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

+161

숫자로 된 우편 번호를 저장하지 마십시오. 일부 국가에는 우편 번호가 있습니다. – Sec

7

의 printf는 다양한 포맷 옵션을 할 수 있습니다.

예 : 당신이 * 괜찬아 기계에있는 경우

printf("%05d",zipcode); 
40

직접 페이지 :

0 값은 0으로 채워야합니다. E, f, F, g 및 G 변환의 경우 변환 된 값은 공백이 아닌 0으로 왼쪽 에 채워집니다. 0 및 - 플래그 이 모두 표시되면 0 플래그는 무시됩니다. 숫자 변환 (d, i, o, u, x 및 X)이있는 의 정밀도가 제공된 경우 0 플래그는 이 무시됩니다. 다른 전환의 경우 동작이 정의되지 않습니다.

질문이 C 인 경우에도 this 페이지가 도움이 될 수 있습니다.

14

가 :

man 3 printf 

이가 표시됩니다 당신은 최소 필드 폭 앞에 0을 배치

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

3 번호가 필요한 이유는 무엇입니까? – Elric

+1

@ 엘릭'man' 명령어에 숫자 인자를 주면, 그 특정 섹션으로 범위를 좁 힙니다. 그것 없이는 C 함수 대신 쉘 명령어 인'printf'에 대한 맨 페이지를 얻을 수 있습니다. –

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

여기에서 "05"는 "앞에 오는 0으로 5 자리 숫자 사용"이라고 말합니다.

138

올바른 해결책은 우편 번호를 데이터베이스에 STRING으로 저장하는 것입니다. 그것이 숫자처럼 보일 수도 있다는 사실에도 불구하고, 그것은 아닙니다. 각 부분이 의미를 갖는 코드입니다.

숫자는 산술 연산입니다. 우편 번호는 그렇지 않습니다.

+19

예. 귀하의 관찰은 절대적으로 정확합니다. 그것이 내가하는 일입니다. 그러나 질문을하는 사람은 프로덕션 코드 대신 숙제를 다루려고합니다. 대답은 질문하는 사람에게 맞춰야합니다. – EvilTeach

+11

내가 더 익숙하지 않은 언어로 선행 및 후행 캐릭터를 어떻게 할 수 있는지보기 위해 설명하기 위해 내가 더 정확하게 설명해야한다고 생각합니다. 앞으로 임의의 예를 더 신중하게 다룰 것입니다! – zxcv

+1

다른 나라들, 영국과 같이 우편 번호가 – jjxtra

16

우편 번호는 고도로 현지화 된 입력란이며 많은 국가에서 우편 번호에 문자가 있습니다 (예 : 영국, 캐나다). 따라서이 예제에서는 언제든지 다른 국가의 사용자/고객/클라이언트/기타를 출하하거나 가져 오는 경우 문자열/varchar 필드를 사용하여 저장해야합니다.

그러나 일반적으로 권장 답변 (printf("%05d", number);)을 사용해야합니다.

3

우편 번호를 문자열이 아닌 숫자가 아닌 숫자로 저장하면 문제가 생길 수 있습니다 (장기적으로).

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가 읽기 쉽도록 설계되었습니다. 당신은 문자 배열 우편 번호 []에 우편 번호를 저장해야하는 경우

+2

인데 나는 당신의 의도를 100 % 확신 할 수는 없지만'#define FMT (x) (getFmt (8, x) .c_str())'(* x * 매개 변수에주의하십시오!)를 사용하십시오. – Ponkadoodle

0

, 당신은이를 사용할 수 있습니다

snprintf(zipcode, 6, "%05.5d", atoi(zipcode));