格式化字符串

时间:2013-03-06 14:44:22

标签: java string format

我正在尝试格式化字符串,因为它们到达并符合某些条件。但是如果下面的代币长度不一样,那么就不配了,我该怎么做?我想要所有的“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());

         }
      });
   }
}

2 个答案:

答案 0 :(得分:2)

以下是使用空格填充字符串的示例:

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
IIIIIIIIII

以等宽字体显示相同的2行:

wwwwwwwwww
iiiiiiiiii

答案 1 :(得分:1)

考虑在格式字符串中指定 width ,并在格式中包含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:字体很重要,因为如果它不是固定宽度,宽度实际上取决于字符串的内容。请考虑以下情况(假设您在标准浏览器上使用标准字体):

lll这是五个字符长 mmmmm,长度为五个字符

VS

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

查看对齐问题?