package org.example.basic;
public class Test3 {
public static void main(String[] args) {
info(1, "rtert书rterr喂喂喂喂rtertesfs啊啊沃尔沃ewe二无若erterqw埃尔文无rterrtere我们都有一个级名字奥数热热热热威尔而特特特让它尔特瑞特瑞特让他而rrterr", 33.3f);
info(232435352, "r我们都有一个发生发生纠纷可能是发生;讹aaa多岁的更好让他让他", 45.5f);
info(12220, "哈f书编书111书编编tererter", 20.3f);
}
static public void info(int id, String bookName, float price) {
String s = String.format(
"书编号:%s 书名:%s 书价:%s",
formatStr(id, 10),
formatStr(bookName, 125),
formatStr(price, 10)
);
System.out.println(s);
}
/**
* 是否是汉字字符
*
* @param c
* @return
*/
static public boolean isChineseChar(char c) {
return String.valueOf(c).matches("[\u4e00-\u9fa5]");
}
/**
* 格式化字符串
*
* @param obj
* @param maxLen 占据长度
* @return
*/
static public String formatStr(Object obj, int maxLen) {
String str = String.valueOf(obj);
float curLen = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (isChineseChar(c)) {
// 一个汉字大约是英文字符的1.6倍(估算值)
curLen += 1.63;
} else {
curLen += 1;
}
}
int remainLen = (int) (maxLen - curLen);
if (remainLen < 0) {
throw new RuntimeException("maxLen参数长度过短,最少设置为:" + curLen);
}
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < remainLen; i++) {
sb.append(" ");
}
return String.format("%s%s", str, sb.toString());
}
}
/*
书编号:1 书名:rtert书rterrterrterrtererterterterrtererterterrtererterterrtererterterrtererterterrtererterterrtererterterrtererterterrtererterterrtererterrterr 书价:33.3
书编号:22 书名:r书编te编书r书编te编书编te编书编te编书编te编书编te编书编te编书编te编书编te编书编te编书编te编书编te编书编te编书编te编书编te编书编te编书编te编 书价:45.5
书编号:10000000 书名:哈f书编书编书编书书编书编编tererter 书价:20.3
*/
由于汉字和英文字符的宽度不一致,要想完全解决对齐问题,需要计算汉字宽度,这里估算了下汉字宽度,大概可以对齐了。
|