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

时间:2015-02-12 06:19:51

标签: c++ parsing

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

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

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

2 个答案:

答案 0 :(得分:9)

使用一个充满了接受千位分隔符的语言环境的流将输入转换为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”) locale,它不使用千位分隔符,只是为了使值的数值性质明显化。)

当您需要使用已经作为字符串“插入”程序的内容时,您可以使用std::stringstream进行转换:

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

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

double d;
buffer >> d;

答案 1 :(得分:1)

C解决方案是使用setlocale&amp; 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);