对于负数,使用std :: stringstream的%05d的等价物?

won*_*ime 2 c++ formatting printf stl number-formatting

我正在尝试创建sprintfs'%05d行为的替代品.虽然,我在stackoverflow上发现了一个类似的问题,当我用负数测试时,建议的解决方案对我不起作用.

做一个"sprintf(buf,"%05d", - 12)",我得到"-0012"回来看起来不错.

使用stringstream,width和fill,当从std :: basic_ios :: fill查看文档时,我得到的"00-12"接缝合理

填充字符是输出插入函数在填充结果到字段宽度时填充空格所使用的字符.

但看起来并不像人们想要的那样.

所以我很困惑,不知道我是否做了明显的错误,或者std流中的宽度/填充是否不容易支持这种情况.

可以在键盘上找到可编译的测试代码.以下是基于流的转换的摘录:

std::string NumberToString(const long iVal, const int iNumDigit)
{
    std::stringstream ss;

    if      (iNumDigit >= 0) ss.fill(' ');
    else if (iNumDigit < 0)  ss.fill('0');
    ss.width(std::abs(iNumDigit));

    ss << iVal;

    return ss.str();
}
Run Code Online (Sandbox Code Playgroud)

编辑1:解决方案:

为了将标准流方法与%05d的printf格式匹配,jrok的解决方案可用于带前导零的情况.这是新功能:

std::string NumberToString(const long iVal, const int iNumDigit)
{
    std::stringstream ss;

    if      (iNumDigit >= 0) ss.fill(' ');
    else if (iNumDigit < 0)  { ss.fill('0'); ss.setf(std::ios::internal, std::ios::adjustfield); }
    ss.width(std::abs(iNumDigit));

    ss << iVal;

    return ss.str();
}
Run Code Online (Sandbox Code Playgroud)

jro*_*rok 5

使用流操纵器std::internal.它(以及std::leftstd::right)允许您指定填充字符的位置.例如

std::cout << std::setw(5) << std::setfill('0') << std::internal << -1;
Run Code Online (Sandbox Code Playgroud)

将打印-0001.