前言
在日常开发中,字符串格式化是常用的功能,帮助我们美化输出信息.
假设有这么一段文本需要格式化输出:
INFO 10000 --- [ main] AccountServiceApplication 执行时长 40 ms.
格式化说明
属性 | 内容说明 | 格式要求 |
---|---|---|
INFO | 日志级别 | 占位 5,靠左对齐 |
10000 | 进程 PID 值 | 占位 6 ,居中显示 |
main | 线程名称 | 占位 15,靠右对齐 |
AccountServiceApplication | 执行方法名,占位 30,靠右对齐 | |
40 | 为执行时间值 | 占位 6,靠左对齐 |
Java
JDK 自带的 String.format()
并没有居中的功能,这里借助了 Apache Common-Lang
包进行居中显示。
import org.apache.commons.lang.StringUtils;
String line = "%-5s %s --- [%15s] %30s 执行时长 %-6d ms.";
System.out.println(
String.format(line,
"INFO",
StringUtils.center("10000",6),
"main",
"AccountServiceApplication",
40
)
);
参考资源:Java格式化字符串-String.format()的使用
Kotlin
由于Kotlin
与Java
兼容,上述方案同样适用于Kotlin
.
val line = "%-5s %s --- [%15s] %30s 执行时长 %-6d ms."
println(
line.format(
"INFO",
StringUtils.center("10000", 6),
"main",
"AccountServiceApplication",
40
)
)
Python
以下示例基于
Python3
测试
python
提供了强大的format
方法,使用{}
作为占位符,示例:
# 若 {} 中没有添加序号(0开始)则按照参数顺序
'Hello, my name is {}, {} years old!'.format("Tinker", 45)
# Hello, my name is Tinker, 45 years old!
# 同时可以任意调整顺序
'Hello, my name is {2}, {0} years old, I come from {1}'.format(45,"China","Tinker")
# Hello, my name is Tinker, 45 years old, I come from China
# 使用参数名或者字典(需要在前面加上 ** )
'Hello, my name is {name}, {age} years old!'.format(name="Tinker", age=45)
'Hello, my name is {name}, {age} years old!'.format(**{"name":"Tinker", "age":45})
# Hello, my name is Tinker, 45 years old!
# 填充及格式化
# :[填充字符][对齐方式 <^> 分别是靠左、居中、靠右][宽度]
# 显示身份证后四位
'ID Num: {:*>18}'.format(5437)
# ID Num: **************5437
# 显示手机号码前三位
'Phone Num: {0:*<11}'.format(188)
# Phone Num: 188********
对于前言
中的格式化需求,可以这样写:
'{level:<5} {pid:^6} --- [{thread:>15}] {method:>30} : 执行时长 {time:<6} ms'.format(level="INFO",pid=10000,thread="main",method="AccountServiceApplication",time=40)
JavaScript
JavaScript、Node.js 中并没有直接提供相应的方法来完成上述需求,但是可以自己封装方法。
//此代码来源自 https://github.com/component/pad/blob/master/index.js
/**
* Pad `str` to `len` with optional `c` char,
* favoring the left when unbalanced.
*
* @param {String} str
* @param {Number} len
* @param {String} c
* @return {String}
* @api public
*/
function pad(str, len, c) {
c = c || ' ';
str = str + "";
if (str.length >= len) return str;
len = len - str.length;
var left = Array(Math.ceil(len / 2) + 1).join(c);
var right = Array(Math.floor(len / 2) + 1).join(c);
return left + str + right;
}
/**
* Pad `str` left to `len` with optional `c` char.
*
* @param {String} str
* @param {Number} len
* @param {String} c
* @return {String}
* @api public
*/
function left(str, len, c){
c = c || ' ';
str = str + "";
if (str.length >= len) return str;
return Array(len - str.length + 1).join(c) + str;
}
/**
* Pad `str` right to `len` with optional `c` char.
*
* @param {String} str
* @param {Number} len
* @param {String} c
* @return {String}
* @api public
*/
function right(str, len, c){
c = c || ' ';
str = str + "";
if (str.length >= len) return str;
return str + Array(len - str.length + 1).join(c);
}
则需求方案如下:
data = {
level:"INFO",
pid:"10000",
thread:"main",
method:"AccountServiceApplication",
time:"40"
}
`${left(data.level,5)} ${pad(data.pid,6)} --- [${left(data.thread,15)}] ${left(data.method,30)} 执行时长 ${right(data.time,6)} ms.`
JS 阵营中有很多强大的库能满足以上需求,如 stringjs