c语言怎么使函数接受双精度,如何解析根据C语言环境设置格式化的双精度

博客作者遇到了使用strtod方法解析数值时遇到的问题,特别是当数值格式符合本地设置(如使用逗号作为小数点,点作为千位分隔符)时,strtod无法正确解析负数和带千位分隔符的数字。作者提到,即使通过替换小数点分隔符,strtod仍然不能正确处理某些情况。问题包括:负数解析失败、千位分隔符导致解析错误。寻求解答如何在知晓本地设置的情况下,正确解析这些数值,特别是在负数和千位分隔符是点的情况下。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我发现strtod方法存在问题,我一直用这个方法.

首先它不理解非点小数分隔符,所以我不得不使用它:

std::replace(sSource.begin(), sSource.end(), getDecimalSeparator(), '.');

但是,我没有发现另一个问题,也没有找到解决方法.如果值为负且千位分隔符是一个点(“.”),则strtod返回0并且_EndPtr指向字符串的开头:

// PRECONDITIONS:

// * digit grouping symbol (thousands separator) = "."

// * decimal symbol = ","

// * digital grouping = "123.456.789"

// * negative sign symbol = "-"

// * negative number format = "- 1,1"

// * OS WinXP SP2

// * the rest doesn't matter

double parse(const char* cszValue, char** szStop)

{

// NOTE: error handling code has been removed to simplify the sample

return strtod(sSource.c_str(), szStop);

}

//...

char* szStop = NULL;

double dVal = 0.0;

dVal = parse("123.45", &szStop); // works!

// All the next DON'T WORK!

dVal = parse("123,45", &szStop); // dVal == 123.0 szStop == ",45"

dVal = parse("- 123.45", &szStop); // dVal == 0.0 szStop == "- 123.45"

// the same for "- 123,45"

dVal = parse("1.123.45", &szStop); // dVal == 1.123 szStop == ".45"

// the same for "1.123,45"

dVal = parse("1 123.45", &szStop); // dVal == 1 szStop == " 123.45"

// the same for "1 123,45"

dVal = parse("- 1 123,45", &szStop); // dVal == 0 szStop == start of the string

// the same for "- 1 123.45", "- 1.123,45", "- 1.123.45"

有问题:

>我做错了什么? (回答)

>如果根据本地设置格式化小数分隔符,为什么strtod会失败? (回答)

>即使我用一个点(“.”)替换当前的小数点分隔符并删除所有千位分隔符,如何解析一个负值?检测否定唱,删除它,将值解析为正数并在此之后反转负号?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值