您的位置:首页 > Web前端 > JavaScript

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

2017-12-27 15:25 1376 查看

前言

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

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

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)


参考资源: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息