我发现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会失败? (回答)
>即使我用一个点(“.”)替换当前的小数点分隔符并删除所有千位分隔符,如何解析一个负值?检测否定唱,删除它,将值解析为正数并在此之后反转负号?