将带有千位(和十进制)分隔符的字符串转换为double

Alw*_*uff 5 c++ parsing

用户可以进入double文本框.数字可能包含数千个分隔符.我想在输入数字插入数据库之前验证用户输入.

是否有可以将这样的input(1,555.99)转换为double?的C++函数?如果有,如果输入无效,它是否会发出错误信号(我不想最终得到类似的功能atof)?

类似的东西strtod,但必须接受数千个分隔符的输入.

Jer*_*fin 9

使用一个充满了接受千位分隔符的语言环境的流将输入转换为double.

#include <locale>
#include <iostream>

int main() {
    double d;

    std::cin.imbue(std::locale(""));
    std::cin >> d;

    std::cout << d;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我使用了未命名的语言环境,它从环境中检索语言环境信息(例如,从操作系统)并设置适当的语言环境(例如,在我的情况下,它设置为类似的en_US,它支持逗号作为千位分隔符,所以:

Input: 1,234.5
Output: 1234.5
Run Code Online (Sandbox Code Playgroud)

当然,我也可以std::cout使用某些语言环境(例如)使用不同的千位分隔符,并获得为该语言环境定制的输出(但在这种情况下,我使用了默认的"C"语言环境,它不使用数千个分隔符,只是为了使值的数值性质明显).

如果您需要使用已经作为字符串"在"程序中""的内容执行此操作,则可以使用an std::stringstream进行转换:

std::string input = "1,234,567.89";

std::istringstream buffer(input);
buffer.imbue(std::locale(""));

double d;
buffer >> d;
Run Code Online (Sandbox Code Playgroud)