2016-11-25 171 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")); 
}