在Java中格式化字符串

8

我正在使用readLine()方法读取串行缓冲区。readLine()返回的字符串格式为"str1 : str2"。在while循环中,当我使用readLine()多次获取串口命令的响应时,我会得到奇怪的输出,如下所示:

String1 : string1
SString11 : String2
StringString2 : String23 
String4 : String5

但我需要以下格式的输出
String1       : string1
SString11     : String2
StringString2 : String23 
String4       : String5

我在字符串上使用了split方法,并用分隔符':'将两个字符串分开。但现在我需要在String1后面添加空格以对齐所有冒号。
如果有人理解我的问题,可以建议如何解决吗?
3个回答

21

最简单的方法是使用 System.out.format()。它允许您使用 C 语言的 printf 格式说明符。例如:

System.out.format("%-5s:%10s\n", "Name", "Nemo");
System.out.format("%-5s:%10d\n", "Age", 120);

这将输出:

Name :      Nemo
Age  :       120

此外,请参阅格式化类的文档,以了解有关格式字符串语法的更多信息。


谢谢你的回答。我能否将格式化输出存储在字符串中而不是发送到System.out流中?是否有任何API可用? - Surjya Narayana Padhi
2
你可以像使用System.out.format()一样使用String.format()将结果作为字符串获取。 - tangens
+1 链接到 java.util.Formatter,这可能比 System.out 的 format() 或 printf() 更有用,因为它可以格式化到任意流中,并且在帖子中不清楚输出的目标是什么。 - charstar
要将格式化的输出存储在字符串中,请使用String.format()。 - Vijay Mathew
我使用了String.format(),它起作用了。但是还有另一个问题。问题是我将输出字符串放在了一个JTextArea实例中。我选择了Arial字体。当像这样打印String.format("%-30s:%30s",temp[0],temp[1]);时,它会打印出像这样的结果:Image Name : Basic Linux firmware Version : 2.1.1.17 在上面的两行中,“Image”单词中的“I”和“Version”单词中的“V”具有不同的宽度。因此,即使我使用了30个字符的字符串,冒号也无法对齐。是否有任何解决方案? - Surjya Narayana Padhi
请使用固定宽度字体,如Courier New、Lucida Console、Bitstream Vera Sans Mono、Consolas等。 - basszero

6

1
我使用了String.format(),它有效了。但另一个问题出现了。问题是我要把输出字符串放在JTextArea示例中。我选择了Arial字体。当像这样打印String.format("%-30s:%30s",temp[0],temp[1]);时, 它的输出是这样的: Image Name : Basic Linux firmware Version : 2.1.1.17 在上面两行中,“Image”单词中的“I”和“Version”单词中的“V”在文本区域中具有不同的宽度。因此,即使我使用了30个字符的字符串,冒号仍无法对齐。是否有解决方案? - Surjya Narayana Padhi
看一下java.awt.FontMetrics(也许......很长时间没关心过文本字段/区域的宽度了 :-) - TofuBeer
1
你需要使用像Courier这样的字体,这被称为“等宽”字体,意味着所有字符都具有相等的宽度。当然,这意味着如果你的字符在字符串中对齐,它们也会在输出时对齐。 - Peter Lindqvist

4

System.out.format("%30s : %s", str1, str2);

这行代码会将第一个字符串以固定宽度为30个字符的形式打印出来。


我喜欢这里第一个参数的右对齐! - Domenic D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接