2013-03-06 4 views
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()); 

     } 
     }); 
    } 
} 
+1

Могли вы показываете пример выхода, не выстраивающегося вверх? –

+0

Здесь вы идете, справа. http://i.imgur.com/eBlr2Yt.png Нижний IP запускается слишком рано, я бы хотел сделать больше места между предыдущей строкой и IP для каждой строки, а нижняя строка должна совпадать с предыдущими строками – Paul

+0

Поэтому, возможно, я должен изменить все на% s. – Paul

ответ

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.

EDIT: Кроме того, глядя на ваше изображение, вам нужно использовать шрифт фиксированной ширины в вашем выходе. В противном случае вам нужно будет начать вычислять ширину отображаемого текста в пикселях. Очень сложная проблема.

EDIT 2: шрифт имеет значение, потому что, если он не является фиксированной шириной, ширина будет зависеть от содержимого вашей строки. Рассмотрим следующий пример (при условии, что вы используете стандартный шрифт на стандартном браузере):

LLLLL, что было пять символов
ммммм, что было пять символов

против

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

См вопросы выравнивания?

+0

Ive пробовал такие вещи, как String result = String.format («% 10s% 2s% 2s% s% 2s% 8s% s \ n», токены [0], «is», токены [2], «.», IP "," адрес: ", токены [1]); и, хотя это лучше, это еще не все. Я не уверен, почему ширина шрифта является проблемой? Я знаю, что все по-разному ширины atm, но когда я пытался \ t, он все равно перечертил все, поэтому я предположил, что какой-то метод строкового формата тоже это сделал бы, может быть, я просто подумал, что они выстроены вверх – Paul

+0

android: typeface = "monospace" сделал трюк спасибо – Paul

+0

Хорошо, хорошо. Я только что отредактировал ответ, чтобы проиллюстрировать проблему с шрифтом. – pamphlet

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 
+0

Жду это, похоже, похоже на то, что я делаю, поэтому я не знаю, почему он не работает. Теперь у меня есть моноширинный шрифт! Android: гарнитура = "моноширинный" – Paul

Смежные вопросы