2016-11-25 150 views
1

我試圖做一個簡單的函數,它可以將數字與千位分隔符轉換爲不帶分隔符的整數。我所有的數字都在0到999.999的範圍內,所以我最初的目的只是把它當作一個double來處理,然後乘以1000並稱之爲一天,但是這樣做還有更多的方法嗎?:刪除千位分隔符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,前1000使用x/1000獲得,最終1000使用x % 1000獲得。

+0

我有一個帶有數字的CSV文件,其中一個字段是特定足球比賽中觀衆的數量。在不允許編輯的文件中,數字使用分隔符列出。你如何將'6.185'轉換爲6185整數? – TobiasKnudsen

+1

我把它看作兩個整數,用'.' – Bathsheba

+0

@TobiasKnudsen分隔。1)如果你解析的是CSV,把字符串*中的千位分隔符*除去(在將它轉換爲數字之前)部分解析。 2)也許你不允許編輯* CSV,但你可以創建一個便於分析的工作副本(例如沒有數千個分隔符)。 – 2016-11-25 14:24:15

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); 
} 

如果你想很HI-PERF,避免getchar並解析緩衝串(或至少使用getchar_unlocked)。

或者,您可以使用字符串,將合法字符複製到緩衝區,然後在該緩衝區上運行strtoul或類似的。

如果你從一個需要更多數字的緩衝區解析它們,你應該只需要22個字符的緩衝區max(假設基數爲10),否則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")); 
}