在C ++中转换为字符串时限制float的小数位

时间:2015-01-28 06:47:49

标签: c++ vector floating-point

我正在创建一个打印std::vector<float>的元素的函数。

工作代码:

std::vector<float> components { 1, 2, 3 };

string result = "<";

for ( auto it = begin(this->components); it != end(this->components); ++it ) {
    result.append(to_string(*it));
    if (it != (this->components))
        result.append(", ");
}

result.append(">");
std::cout << result;

预期的结果是,如果“components”具有元素1,2,3,例如,它将打印:<1, 2, 3>

现在它正在将数字打印为浮点数,当然,就像< 1.000000, 2.000000, 3.000000, >一样。

有没有办法可以控制字符串中放入多少小数位,而不必逐个字符地手动完成?

作为旁注,如何阻止它在最后一个元素之后添加','

4 个答案:

答案 0 :(得分:2)

您可以使用std::stringstream.precision 只需创建一个std::stringstream将其转换为字符串即可。

像这样:

stringstream ss;
ss.precision(3);

ss << "<";

for ( auto it = begin(this->components); it != end(this->components); ++it ) {
    ss << *it;
    if (it != (this->components))
        ss << ", ";
}

ss << ">";

string result = ss.str();

答案 1 :(得分:0)

你可以在投射前使用sprintf()

float a = 1.000000;
char aa[20];
sprintf(aa, "%1.3f", a);

这是我运行的完整代码:

#include <vector>
#include <iterator>
#include <iostream>

using namespace std;

int main()
{
    std::vector<float> components{ 1, 2, 3 };

    string result = "<";

    for (auto it = components.begin(); it != components.end(); ++it) {
        float a = *it;
        char aa[20];
        sprintf(aa, "%1.3f", a);
        result.append(string(aa));
        if (it+1 != components.end())
            result.append(", ");
    }

    result.append(">");
    std::cout << result.c_str();
    getchar();
    return 0;
}

输出:

enter image description here

答案 2 :(得分:0)

我会这样使用stringstream

#include <iostream>
#include <sstream>
#include <iomanip>
#include <vector>

int main()
{
    std::vector<float> components {1, 2, 3, 1.5f, 2.5f, 3.5f, 1.25f, 2.25f, 3.25f, 1.12345f};

    std::stringstream result;
    result << "<";
    for(auto it = std::begin(components); it != std::end(components); ++it)
    {
        if(it != std::begin(components))
        {
            result << ", ";
        }
        result << *it;
    }
    result << ">";
    std::cout << result.str();
    return 0;
}

您还可以使用std::fixedstd::setprecision根据需要进一步修改输出。

在第一项之外的所有项目的下一项之前打印逗号会修复您的尾随逗号问题。

这是demo的工作:

答案 3 :(得分:0)

正如@Axalo已经指出的那样,您可以setprecision使用ostream来设置其精确度(并且可以与任何ostream一起使用,而不仅仅是cout

为了消除尾随的逗号,我可能会使用我在其他地方发布的infix iterator

使用它,代码可以这样编写:

#include <iostream>
#include <sstream>
#include <vector>
#include <iomanip>

#include "infix_iterator.h"

int main () {
    // Data that would display extra precision if we didn't stop it
    std::vector<float> components { 1.123f, 2.234f, 3.345f };

    std::ostringstream buff("<", std::ios::app);
    buff << std::setprecision(2);

    std::copy(components.begin(), components.end(), 
              infix_ostream_iterator<float>(buff, ", "));

    buff << ">";

    std::cout << buff.str();
}

结果:<1.1, 2.2, 3.3>