字符串输出格式化(Java、Python、JavaScript、Kotlin)

时间:2023-02-25 14:46:24

前言

在日常开发中,字符串格式化是常用的功能,帮助我们美化输出信息.

假设有这么一段文本需要格式化输出:

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

由于KotlinJava兼容,上述方案同样适用于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)

参考资源:python之字符串格式化(format)

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