优秀的编程知识分享平台

网站首页 > 技术文章 正文

格式串详解中你不知道的知识

nanyue 2025-01-18 23:01:50 技术文章 4 ℃


不同语言格式串五花八门,究其本质,无非是如何处理格式串和变量对应关系。


示例: 输出右对齐宽度为8个字符整形数据

  • C/ObjC/Java/Ruby/Go
    • %8d
      直接依赖库函数解析格式串,区分格式符前缀%、对齐长度、对齐方向、类型等,做填充、对齐操作。
  • C++
    • std::setw(8)和std::right
      C++ 输出流对象提供方法,设置对齐长度和对齐方向。
  • C#
    • "{0,8:D}"
      和C语言风格很像,不过用新的展示格式,冒号分隔。
  • Python
    • {num:8d}
      最接近C语言风格。
  • Rust
    • {:8}
  • VB.NET
    • String.Format("{0,8}", num)
  • Pascal
    • 整型a输出宽度为8:a:8


格式串语法

  • C语言: %[flag][min width][.precision][length]format
    • min width/precision/length在不同语境部分可选或要忽略
  • Java: %[arguments_index$][flags][field width][.precision]format


浮点数小数位

如下示例保留两位小数:

  • 仓颉:float_var.format(".2")
  • C/ObjC/C++: "%.2f"
  • Pascal:float_var:0:2


不同进制

  • C语言 %o和%x代表八进制和十六进制。
  • C# {:X}代表十六进制,例如#34;{12:X}" 输出C.


带前缀的格式串

  • C/ObjC/C++ 允许用%#o和%#x分别代表加前缀的八进制和十六进制。
    即,15的%#o格式是017, %#x格式为0xf. 当然,%#X对应为0XF.


格式串大小写

  • C语言%g/%e代表浮点数,大写%G和%E功能一样,但表达指数的E用大写,而非前面的小写。


看起来另类的格式串

  • C语言“%8%”会输出一个百分号%, 且左侧有7个空格。
  • C语言%n代表已经输出的字节个数。
    printf("hello我%n\n", &b); // 假设字符串UTF-8编码,b == 8


格式串补零

  • C语言整数格式符%d/%o/%x/%u也可指定精度代表最少位数,最终输出位数不足,会补0.
    printf("%.2d/%.2d/%.4d\n", 2, 12, 12345); // 02/12/12345
  • %02d和%.2d一样可以补0.


宽度和精度可被指定?

  • C语言可以动态指定格式串宽度和精度:
    printf("%.*d\n", 2, 1); // 输出宽度是2,输出01,宽度2也可以用变量传入


废弃的格式符

  • C语言早期,%D指代%ld, %O指代%lo, %X指代%lx, 但后来被发现其实%X也可以指代十六进制大写形式,后来这三个大写格式符被抛弃了。








若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

最近发表
标签列表