0

我编写了一个从字符串中提取双精度的函数。就像 asfas123123afaf 到 123123 或 afafas12312.23131asfa 到 12312.23131 一样,使用点作为小数分隔符。

这是代码:

double get_double(const char *str, char sep)
{


    char str_dbl[80]; 
    size_t i,j; 
    char minus; 
    double dbl; 

    for (minus = 1, i = j = 0; i < strlen(str); ++i) 
    { 

        if ( 
            (str[i] == '-' && minus) 
            || (str[i] >= '0' && str[i] <= '9') 
            || (str[i] == 'e' || str[i] == 'E') 
            ) 
        { 
            str_dbl[j++] = str[i]; 
            minus = 0; 
        } 
    } 
    str_dbl[j] = '\0';       

    dbl = strtod (str_dbl,NULL); 

    return dbl; 



} 

但是现在我想从 ASCII 字符中设置一个用户定义的逗号分隔符 (char sep)(没有 E 或 e,它们是 ^10 的文字)。我怎么能实现它?

让我对此进行说明:我们说分隔符是 ',' 所以字符串是 123123asfsaf,adsd,as.1231 它应该以双精度返回 123123,1231。它识别第一个“,”(从左至右)并忽略所有其他。

我真的很难找到解决这个问题的方法。我曾考虑过 setlocale ,但它似乎不是最好的解决方案。

谢谢!

4

3 回答 3

1

您可以,.执行strtod.

如果您出于某种原因不想修改源字符串,请先将其复制到新字符串中。

于 2012-12-04T11:27:40.030 回答
0

好吧,我知道 usingString.Split会做这种事情,但我认为您应该编写自己的函数,因为它在找到第一个函数时会停止。

这是 msdn 网站以获得更多帮助

MSDN 拆分

于 2012-12-04T10:59:09.960 回答
0

您可以简单地扩展您的代码:

if ( 
            (str[i] == '-' && minus) 
            || (str[i] >= '0' && str[i] <= '9') 
            || (str[i] == 'e' || str[i] == 'E') 
            ) 

char separator = ','; //or whatever you want
int have_separator = 0;

if ( 
            (str[i] == '-' && minus) 
            || (str[i] >= '0' && str[i] <= '9') 
            || (str[i] == 'e' || str[i] == 'E') 
            || str[i] == separator
            ) 
{ 
  if (str[i] == separator && have_separator == 0)
  {
    have_separator = 1;
    str_dbl[j++] = str[i];
    continue;
  }
...

请注意,这只是一些尝试展示这个想法 - 不是真正的工作代码(但它无论如何都可以工作)。您可以使用类似的概念。

于 2012-12-04T11:05:38.813 回答