C에서 선행 0을 인쇄합니까?


345

우편 번호에 01001과 같은 선행 0을 인쇄하는 좋은 방법을 찾으려고합니다. 숫자는 1001로 저장되지만 좋은 방법은 무엇입니까?

나는 두 가지 경우 중 하나를 사용하여 숫자가 몇 자릿수인지 알아 내고 인쇄를 위해 여분의 0을 가진 char 배열로 변환하려고 생각했지만 도울 수는 없지만 사용할 수있는 방법이 있다고 생각합니다. 나를 피하는 printf 형식 구문.

답변:


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

0당신이 패딩과 무엇을 나타냅니다 5쇼에게 정수의 길이를. 예를 들어 "%02d"(날짜에 유용함)을 사용 하면 1 열의 숫자에 대해 0 만 채 웁니다 (. 06대신 6). 예제 2 "%03d"는 1 열에서 1 개의 숫자에 대해 2 0을 채우고 10의 열에있는 숫자에 대해서는 1을 채워 넣습니다. 즉. (번호 7이 채워 007지고 번호 17이가 채워짐 017).


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

1
귀하의 경우에는 이것으로 충분합니다. 길이를 알 수없는 정수에서 선행 0을 어떻게 가질 수 있습니까?
Dominic Motuka

마지막으로 채워진 문자열의 최대 길이를 알아야합니다. 또는 항상 5 개의 선행 0을 원하면 "00000"+ integer.to_s입니다. 기타
mlambie

160

올바른 해결책은 우편 번호를 데이터베이스에 STRING으로 저장하는 것입니다. 숫자처럼 보일 수도 있지만 그렇지 않습니다. 각 부분마다 의미가있는 코드입니다.

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


32
당신. 당신의 관찰은 절대적으로 정확합니다. 그게 내가하는 일입니다. 그러나 질문하는 사람은 아마도 생산 코드 대신 숙제를 처리하려고합니다. 답변은 질문을하는 사람에게 맞춰져야합니다.
EvilTeach

15
익숙하지 않은 언어로 선행 및 후행 문자를 수행 할 수있는 방법을 찾고 있다고 설명하기 위해 더 정확하게 표현해야한다고 가정합니다. 앞으로 임의의 예제를 사용하여 더 조심하겠습니다!
zxcv

3
영국 같은 다른 나라, 우편 번호에서 문자가
jjxtra


16

우편 번호는 고도로 지역화 된 필드이며 많은 국가에서 영국, 캐나다와 같은 우편 번호에 문자가 있습니다. 따라서이 예에서는 문자열 / varchar 필드를 사용하여 다른 국가에서 사용자 / 고객 / 클라이언트 / 등을 배송하거나 가져 오는 경우 저장해야합니다.

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


16

* NIX 시스템을 사용중인 경우 :

man 3 printf

다음과 유사한 매뉴얼 페이지가 표시됩니다.

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

C에 대한 질문이지만 페이지가 도움 될 수 있습니다.


1
왜 3 개의 숫자가 필요한가요?
eri0o

4
@Elric man명령에 숫자 인수를 제공하면 특정 섹션으로 범위가 좁아집니다. 그것 없이는 printfC 함수 대신 쉘 명령에 대한 매뉴얼 페이지를 얻을 수 있습니다.
Paul Tomblin

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

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


6

printf는 다양한 형식화 옵션을 허용합니다.

전의:

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

3

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


누군가 만 char 배열을 제로 패드하는 방법을 설명한다면. atoi ()를 사용하여 char 배열을 초기화 한 다음 % 05d를 사용하는 솔루션도 있습니다. 이것이 유일한 해결책이 아니기를 바랍니다.
Niko

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를 더 읽기 쉽도록 설계되었습니다.


4
매크로에 대한 의도는 100 % 확실하지 않지만 변수 (코드가하는 것)와는 달리 ( x 매개 변수 #define FMT(x) (getFmt(8,x).c_str())참고 !) 와 같은 함수를 정의하려는 것처럼 보입니다 .
Ponkadoodle

0

우편 번호를 문자 배열 zipcode []에 저장해야하는 경우 다음을 사용할 수 있습니다.

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.