20 Stimmen

Warum funktioniert die Trimmung nicht?

Ich versuche, führende Whitespaces aus der Zeichenfolge zu trimmen, und ich weiß nicht, was mit meinem Ansatz falsch ist, alle Vorschläge wäre geschätzt?

Code:

this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim();

Ich lese poNumber aus der csv-Datei als "IG078565 und IG083060" und gebe auch denselben Wert mit denselben Leerzeichen aus, bin mir aber nicht sicher, warum?

Aktualisiert

Hinzufügen einer vollständigen Methode für einen besseren Kontext:

public BillingDTO(String currency, String migrationId, String chargeId, String priceId, String poNumber, String otc,
            String billingClassId, String laborOnly) {
        super();
        this.currency = currency.equals("") ? currency : currency.trim();
        this.migrationId = migrationId.equals("") ? migrationId : migrationId.trim();
        this.chargeId = chargeId.equals("") ? chargeId : chargeId.trim();
        this.priceId = priceId.equals("") ? priceId : priceId.trim();
        this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim();
            //poNumber.trim();
        //System.out.println("poNumber:"+this.poNumber.trim());
        //this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim();
        this.otc = otc.equals("") ? otc : otc.trim();
        this.billingClassId = billingClassId.equals("") ? billingClassId : billingClassId.trim();
        this.laborOnly = laborOnly.equals("") ? "N" : laborOnly;
    }

Gracias.

48voto

Bozho Punkte 570413

Update Es scheint, dass Ihr Whitespace kein Whitespace ist (ascii=32). Bei Ihnen ist es der Code 160, der ein Leerzeichen ohne Unterbrechung ist. trim() nicht behandelt. Sie müssen also etwas wie folgt tun:

this.poNumber = poNumber.replace(String.valueOf((char) 160), " ").trim();

Sie sollten besser ein Dienstprogramm erstellen - YourStringUtils.trim(string) und führen dort die beiden Operationen durch - beide .trim() und die replace(..)


Ursprüngliche Antwort:

Verwenden Sie einfach this.poNumber = poNumber.trim();

Besteht die Möglichkeit, dass poNumber zu sein null können Sie die nullsichere this.poNumber = StringUtils.trim(poNumber); de commons-lang .

Sie können auch Folgendes verwenden trimToEmpty(..) aus derselben Klasse, wenn Sie wollen null in eine leere Zeichenkette umgewandelt werden.

Wenn Sie sich nicht auf commons-lang verlassen wollen, dann fügen Sie einfach eine if-Klausel hinzu:

if (poNumber != null) {
    this.poNumber = poNumber.trim();
}

Wie in den Kommentaren unter der Frage erwähnt, sollten Sie sicherstellen, dass Sie nach dem Trimmen die richtige Variable überprüfen. Sie sollten die Instanzvariable prüfen. Ihr Parameter (oder lokale Variable, kann ich nicht sagen) ändert sich nicht, weil Strings unveränderlich sind.

3voto

Phil Punkte 2288

Sind Sie sicher, dass Sie die richtige Variable für Ihre Ausgabe lesen? Sie haben "poNumber", die die ursprüngliche, nicht abgeschnittene Zeichenfolge ist, und "this.poNumber", die die abgeschnittene Zeichenfolge erhalten würde.

1voto

M. Jessup Punkte 7916

Ihre Datei enthält möglicherweise Nicht-Ascii-Whitespace, der nicht abgeschnitten wird. Zum Beispiel gibt es ein Unicode-Zeichen, das kein Leerzeichen ist (U+00A0), das als Leerzeichen angezeigt wird, aber von trim nicht berücksichtigt wird (dies ist etwas, das Sie z.B. in einem mit Wordpad oder anderen Editoren bearbeiteten Dokument sehen können, die versuchen, Ihnen zu "helfen"). Wenn Sie sich die Definition von String.trim() ansehen, werden Zeichen entfernt, die <= ' ' sind (d.h. Wert kleiner oder gleich 20).

Drucken Sie also die Byte-Werte Ihrer Zeichenkette aus (oder betrachten Sie sie in einem Hex-Editor) und stellen Sie sicher, dass Ihre Leerzeichen tatsächlich Leerzeichen sind (d. h. Dezimalwert 20). Wenn Sie ein anderes Verhalten benötigen, müssen Sie möglicherweise Ihre eigene Trim-Utility-Funktion schreiben, die eine korrekte Unicode-Prüfung mit Character.isWhiteSpace(char) verwendet.

1voto

Ertuğrul Çetin Punkte 5071

Sie könnten diese Funktion verwenden, ich habe einige Manipulationen an der Java trim()-Methode vorgenommen und diese ist viel besser, schneller und effizienter als einige replace()-Methoden.

public static String trimAdvanced(String value) {

        Objects.requireNonNull(value);

        int strLength = value.length();
        int len = value.length();
        int st = 0;
        char[] val = value.toCharArray();

        if (strLength == 0) {
            return "";
        }

        while ((st < len) && (val[st] <= ' ') || (val[st] == '\u00A0')) {
            st++;
            if (st == strLength) {
                break;
            }
        }
        while ((st < len) && (val[len - 1] <= ' ') || (val[len - 1] == '\u00A0')) {
            len--;
            if (len == 0) {
                break;
            }
        }

        return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value;
    }

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