2016-11-25 1 views
1

천 단위 구분 기호가있는 숫자를 구분 기호없이 정수로 변환 할 수있는 간단한 함수를 만들기 위해 노력하고 있습니다. 내 모든 숫자는 0에서 999.999까지의 범위 내이므로 초기 값은 double처럼 처리 한 다음 1000으로 곱하고 하루라고 부르지 만 generel 방식으로 이것을 수행합니까? :천 단위 구분 기호 C 프로그래밍을 제거

#include <stdio.h> 
main() { 
    double a; 
    a=369.122; 
    int b; 
    b = a * 1000; 
    printf("b is %d", b); 
} 

내 현재의 솔루션입니다 :

#include <stdio.h> 
main() { 

    char *XD = "113.321"; 

    int s1, s2; 

    sscanf(XD, "%i.%i", &s1, &s2); 
    printf("%i", s1 * 1000 + s2); 
} 
+1

당신은 그것을하고 싶지 않습니다 ... 당신은 "b"를 범할 수도 있습니다. –

답변

4

이것에 대한 double 사용으로 인해 부동 소수점 부정확성에 적합하지 않은 : 당신은 1000 곱한와 int에자를 때, 당신이 결국 사실을 발견했습니다 당신이 정말로 원하는 것보다 1 작은 숫자.

int의 최대 값은 32767로 작을 수 있습니다. 이러한 플랫폼에서는 b을 오버플로합니다.

내가 너라면, long을 사용하고 값을 표시하려면 1000s 구분 기호를 사용하십시오. 양수 인 x의 경우 x/1000을 사용하여 처음 1000을 얻었으며 x % 1000을 사용하여 최종 1000을 얻습니다.

+0

숫자가있는 CSV 파일이 있습니다. 필드 중 하나가 특정 축구 경기의 관중 수입니다. 편집이 허용되지 않은 파일에서 분리자를 사용하여 번호가 나열됩니다. 어떻게 '6.185'를 정수 6185로 변환하겠습니까? – TobiasKnudsen

+1

두 개의 정수로'.'로 구분하여 읽을 것입니다. – Bathsheba

+0

@TobiasKnudsen 1) CSV를 파싱하는 경우, 문자열 *에서 천 단위 구분 기호 *를 제거한 후 (숫자로 변환하기 전에) 파싱의 일부. 2) 아마도 CSV를 편집 할 수있는 권한이 없을 수도 있지만 구문 분석에 편리한 작업 사본을 만들 수 있습니다 (예 : 천 단위 구분 기호 제외). –

0

입력 내용을 직접 구문 분석하고 구분 기호를 무시할 수 있습니다. 구문 분석 정수는 간단하다

#include <stdio.h> 
int main() 
{ 
    int c; 
    unsigned n = 0, acc = 0; 
    while(EOF!=(c=getchar())){ 
     if(c>='0' && c<='9') 
      acc = 10*n + c-'0'; 
     else if(c == '.') //ignore your separator 
      continue; 
     else 
      break; //not a digit and not a separator -- end parsing 
     if(acc < n) 
      fprintf(stderr, "overflow\n"); 
     n = acc; 
    } 
    printf("got %d\n", n); 
} 

당신은 매우 하이 퍼포 레이션을하려면 getchar을 피하고 (getchar_unlocked을 사용하여 적어도 나) 버퍼링 된 문자열을 구문 분석..

또는 문자열을 lex하고 합법적 인 문자를 버퍼에 복사 한 다음 strtoul 또는 유사한 버퍼를 실행할 수 있습니다.

버퍼 최대 (기본 10 가정)에 22 자만 필요합니다. 그렇지 않으면 더 많은 자릿수가 필요한 버퍼에서 64 비트 정수를 구문 분석하면 오버플로가 시작됩니다.

0

견고하고 일반적인 해결책은 문자열을 사용하고 숫자가 아닌 모든 것을 건너 뛰는 것입니다. 그렇게하면 로케일 등에 대해 걱정할 필요가 없습니다 (일부 국가에서는 십진수는 ,, 천 단위 구분 기호는 .). 영어권 카운티는 반대이며 천 단위 구분 기호는 공백으로 구분됩니다.

#include <stdint.h> 
#include <inttypes.h> 
#include <ctype.h> 
#include <stdio.h> 

uint32_t digits_only (const char* str_number) 
{ 
    uint32_t result = 0; 

    for(size_t i=0; str_number[i] != '\0'; i++) 
    { 
    if(isdigit(str_number[i])) 
    { 
     result *= 10; 
     result += (uint32_t)str_number[i] - '0'; 
    } 
    } 

    return result; 
} 

int main (void) 
{ 
    printf("%" PRIu32 "\n", digits_only("123,456")); 
    printf("%" PRIu32 "\n", digits_only("123.456")); 
    printf("%" PRIu32 "\n", digits_only("blabla 123 blabla 456 blabla")); 
} 
관련 문제