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

前言

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

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

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 中并没有直接提供相应的方法来完成上述需求,但是可以自己封装方法。

扫描二维码关注公众号,回复: 16561093 查看本文章
//此代码来源自 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 阵营中有很多强大的库能满足以上需求,如 string-format

猜你喜欢

转载自blog.csdn.net/ssrc0604hx/article/details/78912733