使用自定义numpunct将字符串转换为double并不按预期工作

时间:2015-04-22 09:06:49

标签: c++ locale

我正在尝试使用自定义numpunct将字符串转换为double。如果字符串不是货币格式,我希望转换失败 - 例如1,000,000.0

#include <iostream>
#include <sstream>

using namespace std;

class ThousandCommaSeparator: public std::numpunct<char>
{
public:
    ThousandCommaSeparator(){}
protected:
    virtual char do_decimal_point() const { return '.'; }
    virtual char do_thousands_sep() const { return ','; }
    virtual string_type do_grouping() const { return "\3";}
};

int main()
{
    istringstream ss("2015/05/03");
    ss.imbue(locale(cout.getloc(),new ThousandCommaSeparator));

    double output;

    if (ss >> output)
    {
        cout << "Success: " << output << endl;
    }
    else
    {
        cout << "Failure: " << output << endl;
    }
}

我希望上述内容失败,但它总是成功,并将输出值设置为2015.我猜测我错误地使用numpunct,希望有人可以指出我正确的方向!

1 个答案:

答案 0 :(得分:4)

输入流中的数千个分隔符是可选的。如果它们存在,它们必须正确放置,但它们不必存在。

因此,无论2015如何,std::numpunct都是转换为数字的有效输入。