formatter格式说明

本文介绍了一种使用格式说明符进行字符串格式化的详细方法,包括整数、浮点数、日期/时间和布尔值等数据类型的输出格式。此外还介绍了如何设置宽度、对齐方式和填充字符等高级选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

格式说明符

以下是所有支持的转换说明符的快速参考。

说明符适用于输出
%a浮点数 (除了BigDecimal)浮点数的十六进制输出
%b任何类型如果为非空则为“true”,为空则为“false”
%c字符Unicode字符
%d证书(包括byte, short, int, long, bigint)十进制整数
%e浮点数科学计数的十进制数
%f浮点数十进制数
%g浮点数十进制数,根据值和精度可能以科学计数法显示
%h任何类型通过hashCode()方法输出的16进制数
%n平台相关的换行符
%o整数(包括byte, short, int, long, bigint)八进制数
%s任何类型字符串
%t日期/时间 (包含long, Calendar, Date 和TemporalAccessor)%t是日期/时间转换的前缀。后面还需要跟其他的标识,请参考下面的日期/时间转换。
%x整数(包含byte, short, int, long, bigint)十六进制字符串

日期和时间格式

注意:使用 “%T” 替换下面的 “%t” 可以将输出结果变成大写形式。

标识注释
%tA星期几的全名,例如 “Sunday“, “Monday“。
%ta星期几的缩写,例如 “Sun“, “Mon“。
%tB月份的全名,例如 “January“, “February“。
%tb月份的缩写,例如 “Jan“, “Feb“。
%tC年的世纪部分的格式为两位数,从 “00“到“99”。
%tc日期和时间的格式为 “%ta %tb %td %tT %tZ %tY” 如 “Fri Feb 17 07:45:42 PST 2017“。
%tD格式为 “%tm/%td/%ty“ 的日期。
%td两位的日期格式,从 “01”到 “31“。
%te没有前导0的日期,从 “1” 到 “31”。
%tF使用 “%tY-%tm-%td“ 格式的 ISO 8601 日期。
%tH24小时制的小时,从 “00” 到 “23“。
%th同 %tb。
%tI12小时制的小时,从 “01” 到 “12“。
%tj带前导0的年中的日期,从 “001” 到“366“。
%tk没有前导0的24小时制,从 “0” 到 “23“。
%tl没有前导0的12小时制,从 “1” 到“12“。
%tM带前导0的分钟,从 “00” 到“59“。
%tm带前导0的月份,从 “01” 到 “12“。
%tN带前导0的9位纳秒数,从 “000000000” to “999999999”.
%tp和区域相关的 “am” or “pm” 标记。
%tQ1970年1月1日00:00:00 UTC 以来的毫秒。
%tR24小时制的时间,如:“%tH:%tM“。
%tr12小时制的时间,如:“%tI:%tM:%tS %Tp“。
%tS2位数字格式的秒,从 “00” 到 “60”。 “60” 需要支持闰秒。
%ts1970年1月1日00:00:00 UTC以后的秒数。
%tT24小时制的时分秒,如: “%tH:%tM:%tS“。
%tY4位的年份格式,从 “0000” 到 “9999“。
%ty2位的年份格式,从 “00” 到 “99“。
%tZ时区缩写,如:“UTC“, “PST“。
%tz与GMT的时区偏移量,如 -0800

参数索引

参数索引是以 $ 结尾,在 % 后面的数字,用于指定在参数列表中的参数。参数索引从 1 开始。

String.format("%2$s", 32, "Hello"); // 输出:"Hello"
  • 1

格式化整数

使用%d格式说明符,您可以使用所有整数类型的参数,包括byte,short,int,long 和BigInteger。默认格式:

String.format("%d", 93); // 输出:93
  • 1

指定宽度:

String.format("|%20d|", 93); // 输出:|                  93|
  • 1

指定宽度内的左对齐:

String.format("|%-20d|", 93); // 输出:|93                  |
  • 1

用零填充:

String.format("|%020d|", 93); // 输出:|00000000000000000093|
  • 1

用”+”号打印正数(负数总是包含”-“):

String.format("|%+20d|", 93);  // 输出:|                 +93|
String.format("|%+20d|", -93); // 输出:|                 -93|
  • 1
  • 2

正数之前的空格,按正常值计算负数的“-”。

String.format("|% d|", 93);  // 输出:| 93| 
String.format("|% d|", -36); // 输出:|-36|
  • 1
  • 2

使用和区域相关的千位分隔符,美国的是“,”:

String.format("|%,d|", 10000000); // 输出:|10,000,000|
  • 1

中国的也一样:

String.format(Locale.CHINA, "|%,d|", 10000000)// 输出:|10,000,000|
  • 1

使用左边括号括起来可以跳过“-”。

String.format("|%(d|", -36); // 输出:|(36)|
  • 1

八进制输出。

String.format("|%o|"), 93); // 输出:135
  • 1

十六进制输出。

String.format("|%x|", 93); // 输出:5d
  • 1

八进制和十六进制输出的替代表示。

带前导0的八进制和带前导”0x“的十六进制输出:

String.format("|%#o|", 93); // 输出:0135
String.format("|%#x|", 93); // 输出:0x5d
String.format("|%#X|", 93); // 输出:0X5D
  • 1
  • 2
  • 3

字符串和字符转换

默认格式。

打印整个字符串。

String.format("|%s|", "Hello World"); // 输出:"Hello World"
  • 1

指定字段长度。

String.format("|%20s|", "Hello World"); // 输出:|         Hello World|
  • 1

左对齐文本。

String.format("|%-20s|", "Hello World"); // 输出:|Hello World         |
  • 1

指定最大字符数。

String.format("|%.5s|", "Hello World"); // 输出:|Hello|
  • 1

指定宽度和最大字符数。

String.format("|%20.5s|", "Hello World"); // 输出:|               Hello|
<think>嗯,用户想了解如何配置Formatter相关的日志格式,还要求示例代码。首先,我得回忆一下各个引用里的信息。引用[2]提到了在Django的settings.py中配置日志格式化器,引用[3]是Nested-Logrus-Formatter的Go示例,引用[4]是Boost库的C++例子,而引用[1]虽然讲的是SQL格式化,但可能和日志无关。 用户可能需要不同编程语言的例子,所以应该涵盖Python、Go和C++。Python部分,引用[2]中的配置已经很详细,可以展示如何定义formatter,并应用到handler上。另外,可能还需要补充Python标准库的logging模块的基本配置,比如basicConfig的使用,这样用户有更全面的了解。 对于Go语言,引用[3]中的nested-logrus-formatter示例不错,可以展示如何设置Formatter,隐藏键值,调整字段顺序等。需要解释每个参数的作用,让用户明白如何自定义格式。 C++的Boost.Log部分,引用[4]提到了parse_formatter,可能需要给出一个具体的例子,说明如何设置格式字符串,比如时间、严重等级、消息体等。同时,提醒用户在实际应用中可能需要更详细的配置。 还要注意用户可能的需求,比如自定义格式的常见占位符,例如时间、日志级别、模块名、消息等。需要列出一些常用的占位符,并解释它们的用途,这样用户能根据需求调整格式。 另外,用户可能对格式化器的高级配置感兴趣,比如颜色输出、多行日志处理,或者将日志输出到不同位置。不过根据问题,重点在格式配置,所以可能不需要深入这些方面,但可以稍微提及以供扩展。 需要确保每个示例代码都正确,并且语法无误。比如在Python中,formatter格式字符串是否正确,Go的导入路径是否正确,C++的代码是否完整。还要检查是否有拼写错误,比如是否漏掉了某些配置步骤。 最后,生成的相关问题需要围绕日志格式化的扩展应用,比如不同语言的库、高级配置方法,或者性能优化等。这样用户如果有进一步的问题,可以引导他们深入探索。</think>我将为您介绍如何使用Formatter配置日志格式,并提供Python、Go和C++的示例代码: ### 一、Python标准库配置 在Python中通过logging模块配置: ```python import logging # 基础配置(控制台输出) logging.basicConfig( level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 高级配置(文件输出) handler = logging.FileHandler('app.log') formatter = logging.Formatter( fmt='[%(levelname)s] %(module)s.%(funcName)s | %(message)s', datefmt='%H:%M:%S' ) handler.setFormatter(formatter) logger = logging.getLogger('my_app') logger.addHandler(handler) ``` 常用占位符: - `%(asctime)s`: 记录时间 - `%(levelname)s`: 日志级别(DEBUG/INFO等) - `%(name)s`: logger名称 - `%(message)s`: 日志内容 - `%(filename)s`: 文件名 - `%(lineno)d`: 行号[^2] ### 二、Django框架配置 在settings.py中配置(含请求信息): ```python LOGGING = { 'version': 1, 'formatters': { 'verbose': { 'format': '{levelname} {asctime} {module} {process:d} {message}', 'style': '{', # 使用新式字符串格式化 }, 'simple': { 'format': '%(levelname)s %(message)s' }, }, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': 'debug.log', 'formatter': 'verbose' } }, 'loggers': { 'django.request': { 'handlers': ['file'], 'level': 'DEBUG', } } } ``` ### 三、Go语言示例(使用logrus) ```go package main import ( nested "github.com/antonfisher/nested-logrus-formatter" log "github.com/sirupsen/logrus" ) func main() { log.SetFormatter(&nested.Formatter{ HideKeys: true, // 隐藏字段键 TimestampFormat: "2006-01-02 15:04:05", FieldsOrder: []string{"component", "category"}, }) log.WithFields(log.Fields{ "component": "auth", "category": "security", }).Info("用户登录成功") } ``` ### 四、C++示例(使用Boost.Log) ```cpp #include <boost/log/core.hpp> #include <boost/log/trivial.hpp> #include <boost/log/expressions.hpp> #include <boost/log/utility/setup/file.hpp> namespace logging = boost::log; void init_logging() { logging::add_file_log( keywords::file_name = "sample_%N.log", keywords::format = "[%TimeStamp%] <%Severity%>: %Message%" ); logging::core::get()->set_filter( logging::trivial::severity >= logging::trivial::info ); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值