将带有千(和十进制)分隔符的字符串转换为双精度

Convert string with thousands (and decimal) separator into double

本文关键字:分隔符 字符串 转换 双精度 十进制      更新时间:2023-10-16

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

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

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

使用一个充满了接受千个分隔符的区域设置的流将输入转换为double。

#include <locale>
#include <iostream>
int main() {
    double d;
    std::cin.imbue(std::locale(""));
    std::cin >> d;
    std::cout << d;
}

在这里,我使用了未命名的区域设置,它从环境(例如,从操作系统)中检索区域设置信息,并设置适当的区域设置(例如,在我的情况下,它被设置为类似en_US的东西,它支持逗号作为数千个分隔符,因此:

Input: 1,234.5
Output: 1234.5

当然,我也可以给std::cout注入一些区域设置,例如,使用不同的千位分隔符,并为该区域设置定制输出(但在本例中,我使用了默认的"C"区域设置,它不使用千位分隔符号,只是为了使值的数字性质明显)。

当你需要将程序中已经"作为字符串"的东西进行转换时,你可以使用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);