用户可以在文本框中输入double
。数字可能包含数千个分隔符。在将输入的数字插入数据库之前,我想验证用户输入。
是否有可以将此类输入(1,555.99
)转换为double
的C ++函数?如果有,如果输入无效,它是否会发出错误信号(我不希望最终得到与atof
类似的功能)?
像strtod
之类的东西,但必须接受带有数千个分隔符的输入。
答案 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);