将C格式字符串转换为C++io操纵器

Convert C format string to C++ io manipulators

本文关键字:C++io 操纵 转换 格式 字符串      更新时间:2023-10-16

在C中,我使用printf("%+10.5d\n",x(;打印整数x.

我已经为C++io操纵器编写了一个小的测试用例,但输出有不同的格式:

#include <iostream>
#include <iomanip>
#include <cstdio>
int main(void)
{
        int x = 3;
        printf("%+10.5dn", x);
        std::cout << std::showpos << std::setw(10) << std::setprecision(5) << x << std::endl;
        return 0;
}

输出为:

./testcommand+00003+3

我这里缺少哪个io操纵器来获得与printf相同的输出?

std::setfill
http://www.cplusplus.com/reference/iostream/manipulators/setfill/

带有简短的if语句
((x>0) ? "+" : "" )

因此:
std::cout << ((x>0) ? "+" : "" ) << std::setfill('0') << std::setw(10) << std::setprecision(5) << x << std::endl;

使用boost::format,您可以以更简洁的格式获得您想要的内容。

http://www.boost.org/doc/libs/release/libs/format/doc/format.html

#include <boost/format.hpp>
int main(void)
{
    int x = 3;
    std::cout << boost::format("%+10.5d") % x << std::endl;
    return 0;
}

对于sprintf功能,您可以将cout行更改为这样。

std::string x_string = boost::str(boost::format("%+10.5d") % x);

我能得到的最接近的是这个(注意std::internal(:

#include <iostream>
#include <iomanip>
#include <cstdio>
int main(void)
{
    int x = 3;
    printf("%+10.5dn", x);
    std::cout << std::setfill('0') << std::internal << std::showpos << std::setw(10) << std::setprecision(5) << x << std::endl;
    return 0;
}

这仍然不太正确:

    +00003
+000000003

但这是一个进步。

在这种特殊情况下,我认为这是不可能的,至少并非没有大量的工作。在C++中(与C不同(输出整数时会忽略precision参数,因此仅使用操纵器无法获得所需效果(boost::format也不支持(。你会可能必须格式化为字符串,然后在手动'0'

在过去,我有一个GB_Format类(这是预名称空间天(,有点像boost::format,但它确实支持所有Posix格式规范;以便"%.<i>n</i>d"的工作,我不得不实施积分转换,而不是使用底层流转换。类似以下内容:

std::string
fmtInt( int value, int width, int precision )
{
    unsigned            work = (value < 0 ? -value : value);
    std::string         result;
    while ( work != 0 || result.size() < precision ) {
        result += "0123456789"[ work % 10 ];
        work /= 10;
    }
    result += (value < 0 ? '-' : '+');
    while ( result.size() < width ) {
        result += ' ';
    }
    return std::string( result.rbegin(), result.rend() );
}