2

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

执行“sprintf(buf, "%05d", -12)”,我得到了“-0012”,看起来不错。

使用字符串流、宽度和填充,我得到“00-12”,当查看来自std::basic_ios::fill的文档时,这很合理

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

但看起来并不像人们希望的那样。

所以我很困惑,不知道我是否做错了什么,或者标准流的宽度/填充是否不容易支持这种情况。

可以在 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();
}
4

1 回答 1

5

使用流操纵器std::internal。它(与std::leftand一起std::right)允许您指定填充字符的位置。例如

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

将打印-0001

于 2013-09-26T09:54:40.397 回答