2011-01-18 29 views
20

Sto cercando di tagliare gli spazi bianchi principali dalla stringa e non so cosa c'è di sbagliato nel mio approccio, qualsiasi suggerimento sarebbe apprezzato?Perché il trim non funziona?

Codice:

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

sto leggendo poNumber da file CSV come "IG078565 e IG083060" e l'uscita anche che ottiene lo stesso valore con le stesse spazi bianchi, non so perché?

Aggiornato

Aggiunta metodo completo per una migliore contesto:

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

Grazie.

+1

Che cosa ti aspetti dal codice e che cosa fa invece? –

+0

String # trim() restituisce la stringa originale se ha una stringa vuota, quindi non sono sicuro che anche il condizionale ternario sia necessario ... Qualcuno vuole dirmi se ho torto? –

+0

@ Michael: il codice dovrebbe verificare se il valore è Null, quindi inserire come è in db e se non è null allora dovrebbe rimuovere gli spazi iniziali e finali e quindi inserire. – Rachel

risposta

45

Aggiornamento Sembra che il tuo spazio non sia uno spazio bianco (ascii = 32). Il vostro è con il codice 160, che è uno spazio senza freni. trim() non lo gestisce. Quindi è necessario fare qualcosa di simile:

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

Faresti meglio a creare un programma di utilità - YourStringUtils.trim(string) e ci eseguire le due operazioni - sia .trim() e il replace(..)


risposta originale:

Basta usare this.poNumber = poNumber.trim();

Se E 'possibile che poNumber sia null, quindi è possibile utilizzare lo zero-safe this.poNumber = StringUtils.trim(poNumber); da commons-lang.

È inoltre possibile utilizzare trimToEmpty(..) della stessa classe, se si desidera trasformare null in una stringa vuota.

Se non si vuole fare affidamento su commons-lang, quindi è sufficiente aggiungere una clausola di se-:

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

Come notato nei commenti sotto la domanda - assicurarsi che si sta controllando la variabile a destra dopo il taglio. Dovresti controllare la variabile di istanza. Il tuo parametro (o variabile locale, non posso dirlo) non cambia, perché le stringhe sono immutabili.

+0

Ciò darebbe un errore poNumero può essere Nullo nel file CSV. – Rachel

+1

@Rachel - Ho aggiunto un aggiornamento su 'null'. E il tuo codice darà anche null – Bozho

+0

@Rachel Il tuo codice originale darebbe lo stesso errore. Potresti confondere java con qualche altra lingua. –

3

Sei sicuro di aver letto la variabile giusta per l'output? Hai 'poNumber', che è la stringa originale non tagliata, e 'this.poNumber', che otterrebbe la stringa tagliata.

1

Il file può avere spazi non ascii che non vengono tagliati. Ad esempio c'è un carattere unicode spazio non rompere (U + 00A0), che viene visualizzato come spazio bianco ma non considerato da trim (questo è qualcosa che potresti vedere come in un documento modificato in wordpad o altri editor che cercano di "aiutare" "tu.) Se guardi la definizione di String.trim() rimuove i caratteri che sono < =" "(cioè un valore inferiore o uguale a 20).

Quindi stampa i valori di byte della stringa (o guardala in un editor esadecimale) e assicurati che i tuoi spazi siano effettivamente spazio (cioè il valore decimale 20). Se è necessario un altro comportamento, potrebbe essere necessario scrivere la propria funzione di utilità di ritaglio che utilizza un controllo Unicode Character.isWhiteSpace (char) appropriato.

+0

come fare, non sono sicuro di come possiamo stampare i valori del codice byte. – Rachel

+0

piccola nota - "valore decimale 20" dovrebbe probabilmente leggere "valore decimale 32" o "valore esadecimale 20" ... – weiresr

0

È possibile utilizzare questa funzione, ho apportato alcune manipolazioni sul metodo java trim() e questo è il modo migliore, veloce ed efficiente di alcuni metodi replace().

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