32 Stimmen

Java printf mit variabler Feldgröße?

Ich versuche gerade, etwas C-Code nach Java zu konvertieren, und ich habe ein paar Probleme mit String.printf .

In C, um eine bestimmte Breite auf der Grundlage einer Variablen zu erhalten, kann ich verwenden:

printf("Current index = %*d\n", sz, index);

und formatiert die Ganzzahl so, dass sie eine bestimmte Größe hat, basierend auf sz .

Versuchen:

System.out.println(String.format("Current index = %*d\n", sz, index));

führt zu einem Fehler, da es die * .

Zurzeit habe ich folgendes Schema:

System.out.println(String.format("Current index = %" + sz + "d\n", index));

aber ich hoffe, es gibt einen etwas besseren Weg, ja?

34voto

user1970914 Punkte 348

Deklarieren Sie eine zusätzliche Variable, bevor Sie printf :

String format = "%" + fieldSize + "d";
System.out.printf(format, yourVariables);

(dies ist die erste Lösung, die ich bei einer Websuche gefunden habe)

2voto

Como Punkte 71

Dies ist wohl nicht besser als Ihr "Klotz", aber hier ist eine Methode, die Sie in den Aufruf von printf die die Sternchen durch Breiten ersetzt, die Sie ihr übergeben. Das Ergebnis wird als das eigentliche Format verwendet. Betrachten Sie zum Beispiel diesen Aufruf:

System.out.printf("%04d %2s %-7d;%n", 65, "a", 6);

Ich werde die erste und dritte Breite durch eine eingebettete Funktion ersetzen:

System.out.printf( wf("%0*d %2s %-*d;%n", 4, 7), 65, "a", 6);

Und hier ist der Code:

public static String wf(String fmt, int... widths) {
    return metaWidthFormat('*', fmt, widths);
}

public static String metaWidthFormat(char wmeta, String fmt, int ... widths) {
    if (fmt == null) return null;
    int wix = 0;
    boolean outside = true;
    // initial capacity is sufficient for each substituted width to be 2 digs
    StringBuilder result = new StringBuilder(fmt.length() + widths.length);
    for (char ch : fmt.toCharArray()) {
        if (outside) {
            result.append(ch);
            outside = (ch != '%');
        } else {
            if (ch == wmeta) {
                result.append(widths[wix++]);
            } else {
                result.append(ch);
            }
            outside = (ch == wmeta) || (ch == '%') || Character.isAlphabetic(ch);
        }
    }
    return result.toString();
}

0voto

matsev Punkte 29106

Unter der Annahme, dass index in sz passt, können Sie etwas wie folgt tun:

char[] temp = new char[sz];
Arrays.fill(temp, '0');
DecimalFormat df = new DecimalFormat(new String(temp));
System.out.println(String.format("Current index = %s\n", df.format(index))); 

Beachten Sie, dass durch die Nichtverwendung von Format oder einer ihrer Unterklassen, gibt es keine Locale abhängige Zeichen wie ' ', '.' oder ',' zur Ausgabe hinzugefügt.

-1voto

Harsh Gundecha Punkte 1052

Vielleicht ist es zu spät, aber ich stelle es hier für andere ein

int width = 5;
int precision = 2;
float f = 12.34567f;
System.out.printf("%"+width+"."+precision+"f%n",f);

getestet in Java 1.8

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X