将带有千位(和小数)分隔符的字符串转换为双精度

Convert string with thousands (and decimal) separator into double

用户可以在文本框中输入 double。数字可能包含千位分隔符。我想在将输入的数字插入数据库之前验证用户输入。

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

类似于 strtod,但必须接受带有千位分隔符的输入。

使用包含接受千位分隔符的语言环境的流将输入转换为双精度。

#include <locale>
#include <iostream>

int main() {
    double d;

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

    std::cout << d;
}

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

Input: 1,234.5
Output: 1234.5

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

当您需要对已经 "in" 您的程序中的字符串执行此操作时,您可以使用 std::stringstream 进行转换:

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

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

double d;
buffer >> d;

C 解决方案是使用 setlocale & sscanf:

const char *oldL = setlocale(LC_NUMERIC, "de_DE.UTF-8");
double d1 = 1000.43, d2 = 0;
sscanf("1.000,43", "%'lf", &d2);
if ( std::abs(d1-d2) < 0.01 )
  printf("OK \n");
else
  printf("something is wrong! \n");
setlocale(LC_NUMERIC, oldL);