Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将带千(和十进制)分隔符的字符串转换为双精度_C++_Parsing - Fatal编程技术网

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

C++ 将带千(和十进制)分隔符的字符串转换为双精度,c++,parsing,C++,Parsing,用户可以在文本框中输入double。数字可能包含数千个分隔符。在将输入的数字插入数据库之前,我想验证用户输入 有C++函数,可以把这样的输入( 1555.99代码>代码)转换成双吗?如果有,如果输入无效(我不想以类似于atof)的函数结束),它会发出错误信号吗 类似于,但必须接受带有数千个分隔符的输入。使用一个注入了接受数千个分隔符的区域设置的流将输入转换为double #include <locale> #include <iostream> int main() {

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

有C++函数,可以把这样的输入(<代码> 1555.99代码>代码)转换成<代码>双<代码>吗?如果有,如果输入无效(我不想以类似于

atof
)的函数结束),它会发出错误信号吗


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

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

#include <locale>
#include <iostream>

int main() {
    double d;

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

    std::cout << d;
}
当然,我也可以在
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);
const char*oldL=setlocale(LC_NUMERIC,“de_de.UTF-8”);
双d1=1000.43,d2=0;
sscanf(“1.000,43”、“%lf”、&d2);
如果(标准::abs(d1-d2)<0.01)
printf(“OK\n”);
其他的
printf(“出现了问题!\n”);
setlocale(LC_数字,oldL);

请注意,使用逗号作为分隔符是特定于语言环境的。其他语言环境可能会使用不同的(甚至看起来是向后的)约定:@JonathonReinhart大多数其他欧洲语言使用
或空格作为千位分隔符和
作为十进制分隔符。我成功地设置了语言环境,textbox子类化为只允许输入有效的千位/十进制分隔符。所有这些都被处理好了。我从textbox获取输入,而不是从
cin
获取输入,这就是我对您的答案感到困惑的原因->我如何将您的解决方案应用于包含textbox输入的字符串?类似于
std::string s=1555.22
//转换代码
@AlwaysLearningNewStuff:有关使用
std::stringstream
的示例,请参见编辑的答案。
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);