Java printf:如何通过转换隐式定义/声明空格?



在Java中具有以下功能

printf("%-5s Hello %s %n", "", "There!")

它打印

Hello There! 

其中存在位于左侧的 5 个空白区域。

直到这里它的工作原理是预期的,但是...

我想知道是否可能:如何避免""声明并将%-5s更改为printf可以解释的表示空白空间的内容?

我的意思是:例如%-5e假设e表示字符,因此不再需要显式声明""

类似于%n,它不需要通过printf进行论证。很明显,%s需要一个论据,在这种情况下""但很好奇我的请求是否可以完成。

我阅读了格式化程序javadoc以获取所需的功能,但似乎不存在。

我已经对SO进行了研究,一些建议的解决方案是使用printf中的+,但说实话,它降低了可读性

因此,目标是(格式化以获得更好的呈现(:

From: printf("%-5s Hello %s %n", "", "There!")
To:   printf("%-5e Hello %s %n",     "There!") // %-5e is the functionality I need or looking for

如果您使用的是 Java 12 或更高版本,并且您只需要调整结果字符串的缩进,则可以使用String#indent.使用您的示例在开头插入 5 个空格:

System.out.printf("Hello %s %n".indent(5),  "There!");

由于indent还会规范化行终止字符,因此还可以删除%n

System.out.printf("Hello %s ".indent(1),  "There!");
System.out.printf("Hello %s ".indent(2),  "There!");
System.out.printf("Hello %s ".indent(3),  "There!");
System.out.printf("Hello %s ".indent(4),  "There!");

得到类似的东西:

Hello There! 
Hello There! 
Hello There! 
Hello There! 

你应该像这样定义新的printf

static Pattern EMPTY_CONVERSION = Pattern.compile("%-?(\d+)e");
public static String printf(String format, Object... args) {
StringBuffer sb = new StringBuffer();
Matcher m = EMPTY_CONVERSION.matcher(format);
while (m.find())
m.appendReplacement(sb, " ".repeat(Integer.parseInt(m.group(1))));
m.appendTail(sb);
return String.format(sb.toString(), args);
}

如果您使用 Java 8,请制作自己的repeat

e保留用于浮点转换,因此您可能需要更改它。

最新更新