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

时间:2013-09-26 09:50:19

标签: c++ stl formatting printf number-formatting

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

做一个“sprintf(buf,”%05d“, - 12)”,我得到了“-0012”,看起来不错。

使用字符串流,宽度和填充,在查看来自std::basic_ios::fill

的文档时,我得到的“00-12”接缝合理
  

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

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

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

可编辑的testcode can be found on codepad。 以下是基于流的转换的摘录:

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();
}

EDIT1:解决方案:

为了使std流方法与%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();
}

1 个答案:

答案 0 :(得分:5)

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

std::cout << std::setw(5) << std::setfill('0') << std::internal << -1;

将打印-0001