加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何解析根据C语言环境设置格式化的双精度

发布时间:2020-12-16 06:54:58 所属栏目:百科 来源:网络整理
导读:我发现strtod方法存在问题,我一直用这个方法. 首先它不理解非点小数分隔符,所以我不得不使用它: std::replace(sSource.begin(),sSource.end(),getDecimalSeparator(),'.'); 但是,我没有发现另一个问题,也没有找到解决方法.如果值为负且千位分隔符是一个点(
我发现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,&szStop); // dVal == 0     szStop == start of the string
// the same for "- 1 123.45","- 1.123,"- 1.123.45"

有问题:

>我做错了什么? (回答)
>如果根据本地设置格式化小数分隔符,为什么strtod会失败? (回答)
>即使我用一个点(“.”)替换当前的小数点分隔符并删除所有千位分隔符,如何解析一个负值?检测否定唱,删除它,将值解析为正数并在此之后反转负号?

解决方法

关于不正确的结果,我可以看到由于数字中的空格而引起的问题.根据文档 strtod(),此函数将删除前导空格并在找到数字中间的空格时停止读取并返回转换为double的值.例如,

在下面给出的情况下,strtod在减号后面找到空格,而减号只是一个有效的数值,所以它返回0.0.

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

类似地,对于下面的行,当它找到第二个小数时,它假定它的值结束,因为在数值中不可能有两个小数.

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

如果在下面给出行,它会在1之后找到空格并停止进一步处理并将1作为已解析的double返回.

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

下面的案例类似于我上面提到的第一个案例.

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

我希望这有帮助.

问候,Azher Iqbal

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读