在C++中的逗号分隔浮点数

3

我想将这样的数字列表分开:34,45,12.3,100,34.6,50

只有当数字没有小数点时,我才能够做到这一点:

#include <vector>
#include <string>
#include <sstream>
#include <iostream>

int main()
{
    std::string str = "34,45,12.3,100,34.6,50";
    std::vector<int> vect;

    std::stringstream ss(str);

    int i;

    while (ss >> i)
    {
        vect.push_back(i);

        if (ss.peek() == ',')
            ss.ignore();
    }

    for (i=0; i< vect.size(); i++)
        std::cout << vect.at(i)<<std::endl;

}

这里的问题在于小数。上述代码将会产生以下结果:
34 45 12 3 100 34 6 50

虽然它应该产生:

34 45 12.3 100 34.6 50

基本上,当上面的代码看到一个点'.'时,它会像看到逗号一样处理。

有什么想法吗?


4
你有一个 int 向量,因此它不能存储浮点数;浮点数将被截断为整数部分。将你的向量更改为其元素为浮点数。 - bku_drytt
1
i 应该是一个 float - Chnossos
这是一个重复的问题,链接为https://dev59.com/-XNA5IYBdhLWcg3wBpDs(但由于某些原因,我不认为将其标记为重复并关闭是正确的)。 - Sam Varshavchik
你应该学习整数和浮点数之间的区别。一个提示:整数没有小数部分,因此没有小数点。 - Ken White
不要重复使用变量!声明两个分开的变量。(例如,在for循环中重复使用i。) - Mateen Ulhaq
以上代码会产生:34 45 12 3 100 34 6 50 - 使用哪种编译器/版本和语言环境?通常我只希望它只产生 34 45 12,因为在 12.3 中的 . 应该导致 while (ss >> i) 循环终止,事实上,在我的测试中,在设置为英语的 Win7 上的 VS2013 / MSVC12 上仅得到 34 45 12 - Tony Delroy
3个回答

3

您应该声明 float i 而不是 int i,并将向量声明为浮点数向量而不是整数向量。这是因为12.4不是整数,而是浮点数。


3
你应该使用浮点数,并更改代码使用浮点数而不是整数:
#include <vector>
#include <string>
#include <sstream>
#include <iostream>

int main()
{
    std::string str = "34,45,12.3,100,34.6,50";
    std::vector<float> vect;

    std::stringstream ss(str);

    float i;

    while (ss >> i)
    {
        vect.push_back(i);

        if (ss.peek() == ',')
        ss.ignore();
    }

    for (i=0; i< vect.size(); i++)
    std::cout << vect.at(i)<<std::endl;

}

1
我认为你的代码将12.3解释为两个不同的数字,因为你没有将该数字声明为浮点数。你的向量将所有字符串保存为整数,而不是浮点数。如果你将向量声明为浮点数而不是整数,那么你的问题应该就会解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接