1

我正在尝试在字符串到达​​并满足某些条件时对其进行格式化。但是,如果下面的标记长度不同,事情不匹配,我该怎么做?我希望所有“IP 地址”都匹配。我假设我使用类似 %20s 的东西?

if (tokens.length == 4 && (tokens[3].equals("up") || tokens[3].equals("down"))){
    String result = String.format("%s is %s. IP address: %s \n", tokens[0], tokens[2], tokens[1]);
    final String ReceivedText = mReceiveBox.getText().toString() + result;

    if(tokens[2].equals("up")){
        runOnUiThread(new Runnable() {
        public void run() {
            mReceiveBox.setText(ReceivedText);
            mReceiveBox.setSelection(ReceivedText.length());

         }
      });
   }
}
4

2 回答 2

3

这是一个用空格右填充字符串的示例:

System.out.println(String.format("%-40s", "SHORT TEXT") + "|");
System.out.println(String.format("%-40s", "SOME LONG TEXT") + "|");
System.out.println(String.format("%-40s", "SOME MUCH LONGER TEXT") + "|");

哪个输出:

SHORT TEXT                              |
SOME LONG TEXT                          |
SOME MUCH LONGER TEXT                   |

-格式化标志将左对齐您的文本。没有它,输出看起来像:

                              SHORT TEXT|
                          SOME LONG TEXT|
                   SOME MUCH LONGER TEXT|

此外,如另一个答案中所述,如果您希望所有内容正确对齐,则必须使用等宽字体。

这里有 2 行,每行 10 个字符,字体不是等宽字体:

wwwwwwwwww
iiiiiiiii

以及等宽字体中相同的 2 行:

wwwwwwwwww
iiiiiiiiii
于 2013-03-06T15:22:41.797 回答
1

考虑在格式字符串中指定宽度mReceiveBox.getText().toString(),并包含在格式中(而不是附加结果)。

请参阅:http ://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax

你想最终得到类似的东西:

String result = String.format("%20s%s is %s. IP address: %s \n",
    mReceiveBox.getText().toString(), tokens[0], tokens[2], tokens[1]);

其中 20 是接收框文本的最大宽度。您还需要对 IP 之前的令牌执行相同的操作。

编辑:另外,通过查看您的图像,您确实需要在输出中使用固定宽度的字体。否则,您将需要开始计算渲染文本的像素宽度。一个更棘手的问题。

编辑2:字体很重要,因为如果它不是固定宽度,宽度实际上将取决于字符串的内容。考虑以下内容(假设您在标准浏览器上使用标准字体):

lllll 五个字符长
mmmmm 五个字符长

对比

lllll that was five characters long
mmmmm that was five characters long

看到对齐问题了吗?

于 2013-03-06T14:48:14.093 回答