Як форматувати рядки в Java


Відповіді:


140

Окрім String.format, також погляньте java.text.MessageFormat. Формат менш короткий і трохи ближче до прикладу C #, який ви надали, і ви можете використовувати його і для розбору.

Наприклад:

int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));

Хороший приклад використовує переваги вдосконалень varargs та autoboxing в Java 1.5 і перетворює вищезазначене на однолінійний:

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");

MessageFormatтрохи приємніше робити i18nized множини з модифікатором вибору. Щоб вказати повідомлення, яке правильно використовує форму однини, коли змінна дорівнює 1, а множина в іншому випадку, ви можете зробити щось подібне:

String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });

21
MessageFormat призначений для локалізації, тому будьте уважні при використанні. Наприклад, наступний код, MessageFormat.format("Number {0}", 1234));залежно від мови за замовчуванням, може створювати Number 1,234замість Number 1234.
pavel_kazlou

@ataylor: Привіт, вибачте, але я трохи не збентежений. Я хочу, щоб щось подібне передати об’єкт Class, який має дані & коли {0} it ll take firstname, коли {1} then lastname, як так. Чи можливо подібне {0,choice,0.getFirstName()}чи щось подібне?
user3145373 ツ

@ user3145373 ツ Я не думаю, що так.
ataylor

Добре, я посилаюсь на такий проект .Net як я хочу, codeproject.com/Articles/42310/… , зверніться до цього проекту. Я виглядаю так. Якщо ви знаєте будь-який доступний проект або такі пакети, будь ласка, скажіть мені. Дякую
користувач3145373

233

Погляньте на String.format . Однак зауважте, що він має специфікатори формату, подібні до функцій сімейства printf C - наприклад:

String.format("Hello %s, %d", "world", 42);

Повернеться "Привіт, світ, 42". Ви можете знайти це корисно при вивченні специфікаторів формату. Енді Томас-Креймер був добрим, щоб залишити це посилання в коментарі нижче, який, схоже, вказує на офіційну специфікацію. Найпоширеніші з них:

  • % s - вставити рядок
  • % d - вставити підписане ціле число (десяткове)
  • % f - вставити дійсне число, стандартне позначення

Це кардинально відрізняється від C #, що використовує позиційні позиції з необов'язковим специфікатором формату. Це означає, що ви не можете робити такі речі, як:

String.format("The {0} is repeated again: {0}", "word");

... без фактичного повторення параметра, переданого до printf / format. (див. коментар Scrum Meister нижче)


Якщо ви просто хочете надрукувати результат безпосередньо, ви можете знайти System.out.printf ( PrintStream.printf ) на свій смак.


2
Інший варіант - java.text.MessageFormat, який приймає символи формату стилю {1}. Символи формату String.format () можуть бути схожими на символи формату printf () C, але можуть також відрізнятися. Дивіться download.oracle.com/javase/6/docs/api/java/util/… для повного синтаксису.
Енді Томас

53
String.formatтакож може приймати числові позиції: String.format("%2$s %1$s", "foo", "bar");виведеbar foo
The Scrum Meister

7

Якщо ви вирішите не використовувати String.format, інший варіант - двійковий оператор +

String str = "Step " + a + " of " + b;

Це еквівалент

new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));

Що б ви не використовували, це ваш вибір. StringBuilder швидше, але різниця швидкостей незначна. Я вважаю за краще використовувати +оператор (який робить StringBuilder.append(String.valueOf(X)))і простіше читати.


5
Якщо ви збираєтесь нехтувати мене, поясніть, будь ласка, чому.
Райан Амос

11
1) Відповідаючи на запитання про форматування рядків, ви пояснюєте, як +працює оператор. 2) Ваше пояснення навіть не є точним. +еквівалентно використанню StringBuilder, ні String.concat. (Занадто багато інформації про це.)
Søren Løvborg

6

Я написав для цього простий метод:

public class SomeCommons {
    /** Message Format like 'Some String {0} / {1}' with arguments */
    public static String msgFormat(String s, Object... args) {
        return new MessageFormat(s).format(args);
    }
}

тож ви можете використовувати його як:

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");

5
public class StringFormat {

    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            System.out.println("================================");
            for(int i=0;i<3;i++){
                String s1=sc.next();
                int x=sc.nextInt();
                System.out.println(String.format("%-15s%03d",s1,x));
            }
            System.out.println("================================");

    }
}

outpot "==================================="
ved15space123 ved15space123 ved15space123 "============ ======================

Рішення Java

  • "-" використовується для лівого відступу

  • "15" робить мінімальну довжину струни, яка займає 15

  • Значення "s" (це декілька символів після%) буде замінено нашим рядком
  • 0 колодок наш ціле число з 0s зліва
  • 3 робить наше ціле число мінімальною довжиною 3


1

Це рішення спрацювало на мене. Мені потрібно було динамічно створювати URL-адреси для клієнта REST, тому я створив цей метод, тож вам просто потрібно передати рештуURL, як це

/customer/{0}/user/{1}/order

і додайте стільки парам, скільки вам потрібно:

public String createURL (String restURL, Object ... params) {       
    return new MessageFormat(restURL).format(params);
}

Вам просто потрібно назвати цей метод так:

createURL("/customer/{0}/user/{1}/order", 123, 321);

Вихід

"/ замовник / 123 / користувач / 321 / замовлення"


0

Я написав цю функцію, вона робить правильно. Інтерполюйте слово, починаючи зі $значення однойменної змінної.

private static String interpol1(String x){
    Field[] ffield =  Main.class.getDeclaredFields();
    String[] test = x.split(" ") ;
    for (String v : test ) {
        for ( Field n: ffield ) {
            if(v.startsWith("$") && ( n.getName().equals(v.substring(1))  )){
                try {
                    x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
                }catch (Exception e){
                    System.out.println("");
                }
            }
        }
    }
    return x;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.