将带有千位(和小数)分隔符的字符串转换为双精度
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);
用户可以在文本框中输入 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);