我编写了一个从字符串中提取double的函数。像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-chars设置一个用户定义的逗号分隔符(char sep)(没有E或e,它们是^ 10的文字)。我怎么能实现它?
让我分析一下:我们说分隔符是','所以字符串是123123asfsaf,adsd,as.1231它应该返回123123,1231作为double。它识别第一个','(左起)并忽略所有其他。
我很难为这个问题找到解决方案。我已经考虑过setlocale,但我认为它似乎不是最好的解决方案。
谢谢!
答案 0 :(得分:1)
在执行,
之前,您只需将.
替换为strtod
。
如果由于某种原因不想修改源字符串,请先将其复制到新字符串。
答案 1 :(得分:0)
答案 2 :(得分: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;
}
...
请注意,这只是一些尝试显示的想法 - 而不是真正的工作代码(但无论如何它都可以工作)。你可以使用类似的概念。