将带有千(和十进制)分隔符的字符串转换为双精度
Convert string with thousands (and decimal) separator into double
用户可以在文本框中输入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);
相关文章:
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 字符串开头的分隔符
- 尝试将 c 字符串数组与分隔符连接起来
- 根据新的行分隔符从字符串中删除子字符串
- 同一分隔符之间的多个子字符串
- 字符串流分隔符
- 使用正则表达式c++从单词和分隔符之间的字符串中提取所有子字符串
- C++获取两个分隔符之间的字符串并替换它
- 是否存在像C++中那样带有分隔符的C#原始字符串
- 如何从字符串开头到第二个分隔符中提取子字符串?
- 如何使用两个不同的分隔符拆分字符串
- 将子字符串提取到最后 n 个分隔符C++
- 基于 C++ 中的多个字符串分隔符拆分字符串
- 使用 boost::split 按分隔符的前 N 次匹配来拆分字符串
- 使用分隔符空格解析字符串,但字符串也包含空格
- 获取具有同一分隔符的多个实例的字符串的子字符串
- 具有两个分隔符的字符串流
- 子字符串和分隔符
- 将具有分隔符的字符串拆分为 3 个变量
- C++ 获取两个分隔符字符串之间的字符串