So formatieren Sie Zeichenfolgen in Java

Antworten:

140

Schauen Sie sich neben String.format auch an java.text.MessageFormat. Das Format ist weniger knapp und liegt etwas näher an dem von Ihnen angegebenen C # -Beispiel. Sie können es auch zum Parsen verwenden.

Beispielsweise:

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

Ein schöneres Beispiel nutzt die Verbesserungen von Varargs und Autoboxing in Java 1.5 und verwandelt das oben Genannte in einen Einzeiler:

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

MessageFormatist ein bisschen schöner, wenn man mit dem Auswahlmodifikator i18nisierte Pluralformen macht. Um eine Nachricht anzugeben, die die Singularform korrekt verwendet, wenn eine Variable 1 und ansonsten Plural ist, können Sie Folgendes tun:

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) });
ataylor
quelle
21
MessageFormat dient zu Lokalisierungszwecken. Seien Sie also vorsichtig, wenn Sie es verwenden. Beispielsweise kann der folgende Code MessageFormat.format("Number {0}", 1234));abhängig vom Standardgebietsschema Number 1,234anstelle von erzeugt werden Number 1234.
pavel_kazlou
@ataylor: Hallo, Entschuldigung, aber ich bin ein wenig verwirrt. Ich möchte so etwas wie ich werde Klassenobjekt übergeben, das Daten hat & wann {0} it ll take firstname, wann {1} then lastname, wie so. Ist es so {0,choice,0.getFirstName()}oder so möglich ?
user3145373 ツ
@ user3145373 ツ Das glaube ich nicht.
Ataylor
Ok, gut, ich habe ein .Net-Projekt wie das, das ich möchte, referenziert. Codeproject.com/Articles/42310/… , verweise auf dieses Projekt. Ich sehe so aus. Wenn Sie ein solches Projekt oder solche Pakete kennen, sagen Sie es mir bitte. Vielen Dank
user3145373 ツ
232

Schauen Sie sich String.format an . Beachten Sie jedoch, dass Formatbezeichner erforderlich sind, die denen der printf-Funktionsfamilie von C ähnlich sind - zum Beispiel:

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

Würde "Hallo Welt, 42" zurückgeben. Sie können feststellen , diese hilfreich , wenn man über den Formatbezeich lernen. Andy Thomas-Cramer war so freundlich, diesen Link in einem Kommentar unten zu hinterlassen , der auf die offizielle Spezifikation zu verweisen scheint. Die am häufigsten verwendeten sind:

  • % s - Fügen Sie eine Zeichenfolge ein
  • % d - eine vorzeichenbehaftete Ganzzahl (dezimal) einfügen
  • % f - Geben Sie eine reelle Zahl in Standardnotation ein

Dies unterscheidet sich grundlegend von C #, bei dem Positionsreferenzen mit einem optionalen Formatbezeichner verwendet werden. Das bedeutet, dass Sie Dinge wie:

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

... ohne den an printf / format übergebenen Parameter tatsächlich zu wiederholen. (siehe den Kommentar von The Scrum Meister unten)


Wenn Sie das Ergebnis nur direkt drucken möchten, finden Sie möglicherweise System.out.printf ( PrintStream.printf ) nach Ihren Wünschen.

Martin Törnwall
quelle
2
Eine weitere Option ist java.text.MessageFormat, die die Formatsymbole im {1} -Stil akzeptiert. Die Formatsymbole von String.format () können den printf () -Formatsymbolen von C ähneln, können sich aber auch unterscheiden. Die vollständige Syntax finden Sie unter download.oracle.com/javase/6/docs/api/java/util/… .
Andy Thomas
52
String.formatkann auch numerische Positionen einnehmen: String.format("%2$s %1$s", "foo", "bar");wird ausgegebenbar foo
The Scrum Meister
7

Wenn Sie String.format nicht verwenden, ist die andere Option der binäre Operator +

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

Dies entspricht

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

Was auch immer Sie verwenden, ist Ihre Wahl. StringBuilder ist schneller, aber der Geschwindigkeitsunterschied ist gering. Ich bevorzuge die Verwendung des +Operators (der a ausführt StringBuilder.append(String.valueOf(X)))und es leichter zu lesen findet.

Ryan Amos
quelle
5
Wenn Sie mich negieren wollen, erklären Sie bitte warum.
Ryan Amos
11
1) Als Antwort auf eine Frage zur Formatierung von Zeichenfolgen erklären Sie, wie der +Operator funktioniert. 2) Ihre Erklärung ist nicht einmal richtig. +ist gleichbedeutend mit verwenden StringBuilder, nicht String.concat. (Viel zu viele Informationen dazu.)
Søren Løvborg
6

Ich habe meine einfache Methode dafür geschrieben:

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

Sie können es also verwenden als:

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");
Tomasz Modelski
quelle
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-Lösung

  • Das "-" wird verwendet, um den Einzug zu verlassen

  • Die "15" bewirkt, dass die Mindestlänge des Strings 15 beträgt

  • Das "s" (ein paar Zeichen nach%) wird durch unseren String ersetzt
  • Die 0 füllt unsere Ganzzahl mit 0s auf der linken Seite auf
  • Die 3 macht unsere ganze Zahl zu einer Mindestlänge von 3
Ved Prakash
quelle
1
Sie haben Recht docs.oracle.com/javase/8/docs/api/java/util/…
ℛɑƒæĿᴿᴹᴿ
1

Diese Lösung hat bei mir funktioniert. Ich musste URLs für einen REST-Client dynamisch erstellen, also habe ich diese Methode erstellt, sodass Sie die restURL nur so übergeben müssen

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

und fügen Sie so viele Parameter hinzu, wie Sie benötigen:

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

Sie müssen diese Methode nur so aufrufen:

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

Die Ausgabe

"/ customer / 123 / user / 321 / order"

Felipe Bejarano
quelle
0

Ich habe diese Funktion geschrieben, sie macht genau das Richtige. Interpolieren Sie ein Wort, das mit $dem Wert der gleichnamigen Variablen beginnt .

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;
}
DefconT34
quelle