• C++20 Text formatting


    C++20  Text formatting  格式化字符串,  和 python 类似。

    std::formatter - cppreference.com

    string — Common string operations — Python 3.12.0 documentation

    新格式库位于 头文件中。格式库基于 Python3 中的 str.format() 方法建模。格式字符串基本上与 Python 中的格式字符串相同,通常可以互换。

    基本格式:format(填充与对齐(可选) 符号(可选) #(可选) 0(可选) 宽度(可选) 精度(可选) L(可选) 类型(可选))

    1. std::cout << std::format("{:.2}", std::numbers::pi); //print : 3.1
    2. std::cout << std::format("{:.2f}", std::numbers::pi); //print : 3.14

    上述代码区别在于中括号内是否加入 f 关键字,也就是说若 {:.2} 则指保留两位有效数字,{:.2f} 则表示保留小数点后两位,但需要注意的是,数据类型不能是整形。

    仅从 GCC 13 开始在 GCC 中可用。

    C++ iomanip:
    iomanip 是 C++ 标准库中的一个头文件,用于处理输入输出流中的格式化操作。

    iomanip 头文件提供了一系列的流控制器(stream manipulators),可以用于格式化输入输出的方式。其中包括控制输出的精度、设置字段宽度、对齐方式等操作。

    一些常用的 iomanip 控制器包括:

    • std::setw():设置字段宽度
    • std::setprecision():设置浮点数的精度
    • std::setfill():设置填充字符
    • std::left、std::right、std::internal:设置对齐方式
    • std::fixed、std::scientific:设置浮点数的输出格式
    • 等等。

    通过包含 iomanip 头文件,并使用其中的流控制器,可以在输出流中以不同的格式进行输出,使输出结果更符合需求。
     

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. cout << fixed << right;
    8. cout << setw(6) << "N" << setw(14) << "square root"
    9. << setw(15) << "fourth root\n";
    10. double root;
    11. for (int n = 10; n <= 100; n += 10)
    12. {
    13. root = sqrt(double(n));
    14. cout << setw(6) << setfill('.') << n << setfill(' ')
    15. << setw(12) << setprecision(3) << root
    16. << setw(14) << setprecision(4) << sqrt(root)
    17. << endl;
    18. }
    19. return 0;
    20. }

    输出:

    1. #include
    2. #include // std::setfill() std::setw()
    3. //#include "stdint.h" // uintptr_t
    4. int main()
    5. {
    6. int a = 10;
    7. int* p = &a;
    8. uintptr_t p_addr = (uintptr_t)p;
    9. std::cout << std::uppercase << std::hex << std::setfill('0') << "Address of p = 0x" << p_addr << std::endl;
    10. // 恢复默认的格式设置
    11. std::cout << std::defaultfloat << std::setfill(' ');
    12. {
    13. std::cout << "Formatting Output Example" << std::endl;
    14. // 设置字段宽度为10个字符,并左对齐输出
    15. std::cout << std::setw(10) << std::left << "Name:" << std::setw(10) << std::left << "John" << std::endl;
    16. // 设置精度为2位小数
    17. std::cout << std::fixed << std::setprecision(2);
    18. // 输出一个浮点数,并设置字段宽度和填充字符
    19. std::cout << std::setw(10) << std::right << std::setfill('*') << "Value:";
    20. std::cout << std::setw(10) << std::right << std::setfill('#') << 3.14159 << std::endl;
    21. // 恢复默认的格式设置
    22. std::cout << std::defaultfloat << std::setfill(' ');
    23. }
    24. return 0;
    25. }
    编号方法和描述
    1setiosflags - 它用于设置格式标志。
    2resetiosflags - 用于重置格式标志。
    3setbase - 它用于设置basefield标志。
    4setfill - 它用于设置填充字符
    5setprecision - 它用于设置小数精度。
    6setw - 它用于设置字段宽度。
    7get_money - 它用于获得货币值。
    8put_money - 它用来设置计算货币的值。
    9get_time - 它用于获取日期和时间。
    10put_time - 它用于放置(或设置)日期和时间。

             控   制   符                            作           用                                     
     dec  设置整数为十进制
     hex 设置整数为十六进制
     oct 设置整数为八进制
     setbase(n) 设置整数为n进制(n=8,10,16)
     setfill(c)

     设置字符填充,c可以是字符常或字符变量

     setprecision(n) 设置浮点数的有效数字为n位
     setw(n) 设置字段宽度为n位
     setiosflags(ios::fixed) 设置浮点数以固定的小数位数显示
     setiosflags(ios::scientific)   设置浮点数以科学计数法表示
     setiosflags(ios::left) 输出左对齐
     setiosflags(ios::right) 输出右对齐
     setiosflags(ios::skipws) 忽略前导空格
     setiosflags(ios::uppercase) 在以科学计数法输出E与十六进制输出X以大写输出,否则小写。
     setiosflags(ios::showpos) 输出正数时显示"+"号
     setiosflags(ios::showpoint) 强制显示小数点
     resetiosflags() 

     终止已经设置的输出格式状态,在括号中应指定内容

    在此需要说一下,有效位数默认是 6 位,即 setprecision(6),即小数点前面和小数点后面加起来的位数为 6 个有效数字(注意会四舍五入)。
    另外,科学计数法输出 E 与十六进制输出默认是以小写的,要换成大写需添加 uppercase
    而 setw(n) 设置宽度,若是实际宽度大于被设置的,则 setw 函数此时失效。

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. // 前缀0表示八进制 前缀0x表示十六进制 不带前缀表示十进制
    7. int a = 123;
    8. double pi = 22.0/7.0;
    9. // setbase(n) 设置整数为n进制(n=8,10,16)
    10. // oct 八进制 dec 十进制 hex 十六进制
    11. // setiosflags(ios::showbase) 显示进制的前缀
    12. // 数值默认十进制显示输出
    13. std::cout << a << std::endl;
    14. std::cout << "oct: " << std::showbase << std::setbase(8) << a << " " << std::oct << a << std::endl;
    15. std::cout << "dec: " << std::showbase << std::setbase(10) << a << " " << std::dec << a << std::endl;
    16. std::cout << "hex: " << std::showbase << std::setbase(16) << a << " " << std::hex << a << std::endl;
    17. // setprecision(n) 设置浮点数的有效数字为n位
    18. // 有效位数默认是6位,即setprecision(6),即小数点前面和小数点后面加起来的位数为6个有效数字(注意会四舍五入)
    19. std::cout << pi << std::endl;
    20. std::cout << std::setprecision(12) << pi << std::endl;
    21. // setfill(n) 设置字符填充,c可以是字符常或字符变量
    22. // setw(n) 设置字段宽度为n位, 若是实际宽度大于被设置的,则setw函数此时失效, 只针对其后的第一个输出项有效
    23. // setiosflags(ios::left) 输出左对齐
    24. // setiosflags(ios::right) 输出右对齐 默认右对齐
    25. std::cout << std::setfill('*') << std::setw(20) << std::setprecision(12) << pi << std::endl;
    26. std::cout << std::setfill('*') << std::setw(20) << std::setprecision(12) << std::right << pi << std::endl;
    27. std::cout << std::setfill('*') << std::setw(20) << std::setprecision(12) << std::left << pi << std::endl;
    28. // setiosflags(ios::fixed) 设置浮点数以固定的小数位数显示
    29. std::cout << std::fixed << std::setprecision(12) << pi << std::endl;
    30. // setiosflags(ios::scientific) 设置浮点数以科学计数法表示 科学计数法输出E与十六进制输出默认是以小写的,要换成大写需添加uppercase
    31. std::cout << std::scientific << std::setprecision(12) << pi << std::endl;
    32. std::cout << std::scientific << std::uppercase << std::setprecision(12) << pi << std::endl;
    33. // resetiosflags() 终止已经设置的输出格式状态,在括号中应指定内容
    34. std::cout << std::setiosflags(std::ios::scientific) << std::setprecision(12) << pi << " " << std::resetiosflags(std::ios::scientific) << pi << std::endl;
    35. system("pause");
    36. return 0;
    37. }

    使用 printf sprintf snprintf fprintf vprintf fscanf sscanf :

    【C/C++】format 格式化方法使用技巧(代码实例,皆可运行)_c++ format-CSDN博客

  • 相关阅读:
    Ajax简介
    Pycharm正版2022.2.2 | 官方翻译插件更新tkk失败解决
    基于微信小程序的房屋租赁系统设计与实现(源码+lw+部署文档+讲解等)
    课程思政案例----简道云零代码应用开发实训平台
    AKShare在股票数据中的应用
    Java 中经常被提到的 SPI 到底是什么?
    编程都用什么电脑:深入解析编程者的电脑选择之道
    h5 uniapp如何保存照片【saveImageToPhotosAlbum不支持h5端】
    语法复习之C语言与指针
    关卡一: jQuery编程
  • 原文地址:https://blog.csdn.net/eaglelau/article/details/134328931