Jak sformatować ciągi w Javie


Odpowiedzi:


140

Oprócz String.format również spójrz java.text.MessageFormat. Format mniej zwięzły i nieco bliższy podanemu przez Ciebie przykładowi C # i możesz go również użyć do analizy.

Na przykład:

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));

Lepszy przykład wykorzystuje ulepszenia varargs i autoboxing w Javie 1.5 i zamienia powyższe w jedno-liniowy:

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

MessageFormatjest trochę ładniejszy do robienia liczby mnogiej i18niz z modyfikatorem wyboru. Aby określić komunikat, który poprawnie używa liczby pojedynczej, gdy zmienna ma wartość 1, a w innym przypadku liczby mnogiej, możesz zrobić coś takiego:

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 służy do celów lokalizacyjnych, więc zachowaj ostrożność podczas jego używania. Na przykład MessageFormat.format("Number {0}", 1234));można Number 1,234zamiast tego wygenerować następujący kod w zależności od domyślnych ustawień regionalnych Number 1234.
pavel_kazlou

@ataylor: Witam, przepraszam, ale jestem trochę zdezorientowany. Chcę coś takiego Przekażę obiekt klasy, który ma dane i kiedy {0} it ll take firstname, kiedy {1} then lastname, tak. Czy to możliwe, {0,choice,0.getFirstName()}czy coś takiego?
user3145373

@ user3145373 ツ Nie sądzę.
ataylor

Ok, polecam jeden projekt .Net taki, jaki chcę, codeproject.com/Articles/42310/… , polecam ten projekt , wyglądam tak. Jeśli znasz jakikolwiek projekt lub dostępne pakiety, powiedz mi. Dziękuję
użytkownik3145373 ツ

233

Spójrz na String.format . Należy jednak pamiętać, że pobiera specyfikatory formatu podobne do tych z rodziny funkcji printf C - na przykład:

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

Zwróciłby „Hello world, 42”. Może ci się to przydać podczas poznawania specyfikatorów formatu. Andy Thomas-Cramer był na tyle miły, że zostawił ten link w komentarzu poniżej, który wydaje się wskazywać na oficjalną specyfikację. Najczęściej używane to:

  • % s - wstaw ciąg
  • % d - wstaw podpisaną liczbę całkowitą (dziesiętną)
  • % f - wstaw liczbę rzeczywistą, zapis standardowy

Jest to diametralnie różne od C #, który wykorzystuje odwołania pozycyjne z opcjonalnym specyfikatorem formatu. Oznacza to, że nie możesz robić takich rzeczy jak:

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

... bez faktycznego powtarzania parametru przekazanego do printf / format. (patrz komentarz Scrum Meister poniżej)


Jeśli chcesz wydrukować wynik bezpośrednio, możesz znaleźć System.out.printf ( PrintStream.printf ) według własnych upodobań.


2
Inną opcją jest java.text.MessageFormat, który akceptuje symbole formatu stylu {1}. Symbole formatu String.format () mogą być podobne do symboli formatu C printf (), ale mogą się również różnić. Zobacz download.oracle.com/javase/6/docs/api/java/util/..., aby uzyskać pełną składnię.
Andy Thomas

53
String.formatmoże również zajmować pozycje numeryczne: String.format("%2$s %1$s", "foo", "bar");wyświetlibar foo
Scrum Meister

7

Jeśli zdecydujesz się nie używać String.format, drugą opcją jest + operator binarny

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

Jest to odpowiednik

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

Niezależnie od tego, którego używasz, to twój wybór. StringBuilder jest szybszy, ale różnica prędkości jest znikoma. Wolę używać +operatora (który robi StringBuilder.append(String.valueOf(X)))i łatwiej go czytać).


5
Jeśli masz zamiar mnie negować, wyjaśnij dlaczego.
Ryan Amos,

11
1) W odpowiedzi na pytanie dotyczące formatowania łańcucha wyjaśnisz, jak +działa operator. 2) Twoje wyjaśnienie nie jest nawet dokładne. +jest równoważne z używaniem StringBuilder, a nie String.concat. (Zbyt wiele informacji na ten temat.)
Søren Løvborg,

6

Napisałem do tego moją prostą metodę:

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);
    }
}

dzięki czemu możesz użyć go jako:

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 "=========== =====================

Rozwiązanie Java

  • „-” służy do opuszczania wcięcia

  • „15” oznacza, że ​​minimalna długość ciągu to 15

  • „S” (czyli kilka znaków po%) zostanie zastąpione przez nasz Ciąg
  • 0 wypełnia naszą liczbę całkowitą 0 po lewej stronie
  • 3 powoduje, że nasza liczba całkowita ma minimalną długość 3


1

To rozwiązanie działało dla mnie. Musiałem dynamicznie tworzyć adresy URL dla klienta REST, więc utworzyłem tę metodę, więc po prostu musisz przekazać restURL w ten sposób

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

i dodaj tyle parametrów, ile potrzebujesz:

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

Musisz tylko wywołać tę metodę w następujący sposób:

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

Wyjście

„/ customer / 123 / user / 321 / order”


0

Napisałem tę funkcję, robi to właściwie. Interpoluj słowo zaczynające się $od wartości zmiennej o tej samej nazwie.

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.