【问题标题】:Print leading zeros with C++ output operator?使用 C++ 输出运算符打印前导零?
【发布时间】:2009-02-10 00:00:24
【问题描述】:

如何在 C++ 中格式化我的输出?换句话说,什么C++相当于像这样使用printf

printf("%05d", zipCode);

我知道我可以在 C++ 中使用 printf,但我更喜欢输出运算符 <<

你会用下面的吗?

std::cout << "ZIP code: " << sprintf("%05d", zipCode) << std::endl;

【问题讨论】:

    标签: c++ formatting numbers


    【解决方案1】:

    这可以解决问题,至少对于非负数(a),例如您的问题中提到的邮政编码(b)

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    cout << setw(5) << setfill('0') << zipCode << endl;
    
    // or use this if you don't like 'using namespace std;'
    std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;
    

    控制填充的最常见的 IO 操纵器是:

    • std::setw(width) 设置字段的宽度。
    • std::setfill(fillchar) 设置填充字符。
    • std::setiosflags(align) 设置对齐方式,其中 align 是 ios::left 或 ios::right。

    根据您对使用&lt;&lt; 的偏好,我强烈建议您查看fmt 库(请参阅https://github.com/fmtlib/fmt)。这是对我们格式化内容的工具包的一个很好的补充,并且比大量长度的流管道要好得多,允许您执行以下操作:

    cout << fmt::format("{:05d}", zipCode);
    

    目前 LEWG 也将其目标定位为 C++20,这意味着它有望成为该语言的基础部分(或者几乎可以肯定在以后,如果它不完全潜入的话)。


    (a)如果你确实需要处理负数,你可以使用std::internal,如下:

    cout << internal << setw(5) << setfill('0') << zipCode << endl;
    

    这会将填充字符放在符号和大小之间。


    (b) 这(“所有邮政编码都是非负数”)是我的一个假设,但我保证这是一个相当安全的假设:-)

    【讨论】:

    • 请注意,您也可以只使用cout &lt;&lt; leftcout &lt;&lt; right 进行对齐。
    • 请注意,此解决方案不适用于负数!尝试以这种方式打印“-5”会导致:“000-5”
    • 添加 std::internal 将使此代码对负数正确。
    • @Nadav,你住在邮政编码为负的地区吗? :-) 更严肃的一点是,我将编辑答案以明确这一点。
    • 谢谢。实际上,我发现您的答案正在寻找任何整数(包括负数)的通用解决方案,找到了您很好的排名靠前的答案,但我没有意识到因为提到了邮政编码,所以答案假定整数是正数。感谢您编辑答案,将来可能会帮助更多人。
    【解决方案2】:

    使用setw and setfill 调用:

    std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;
    

    【讨论】:

    • 重新激活并 +1,因为它展示了如何在任何命名空间中执行此操作(还添加了 setfill、sqook,希望你不介意)。
    • 很公平。 “使用命名空间标准;”绝对是邪恶的。 ;)
    • 我认为这个答案应该提到,与std::setw 的设置不同,std::setfill 的设置将在执行输出后保持不变,换句话说,std::cout 的填充字符将是永久更改(直到被另一个 std::setfill 修改)。由于这不太可能是可取的,因此最好保存并恢复以前的填充字符。
    【解决方案3】:

    在 C++20 中,您将能够做到:

    std::cout << std::format("{:05}", zipCode);
    

    同时可以使用the {fmt} librarystd::format是基于。

    免责声明:我是 {fmt} 和 C++20 std::format 的作者。

    【讨论】:

    【解决方案4】:
    cout << setw(4) << setfill('0') << n << endl;
    

    来自:

    http://www.fredosaurus.com/notes-cpp/io/omanipulators.html

    【讨论】:

      【解决方案5】:

      或者,

      char t[32];
      sprintf_s(t, "%05d", 1);
      

      将输出 00001 就像 OP 已经想做的那样

      【讨论】:

      • OP 明确要求一种使用 &lt;&lt; 运算符而不是 (s)printf 的方法。
      • @jankes 这将是:std::cout
      猜你喜欢
      • 2014-02-05
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      相关资源
      最近更新 更多