2011-01-18 13 views
20

Estoy tratando de recortar los espacios en blanco principales de la cadena y no sé lo que está mal con mi enfoque, ¿apreciaría alguna sugerencia?¿Por qué el ajuste no funciona?

Código:

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

estoy leyendo PONumber de archivo csv como "IG078565 y IG083060" y salida también estoy recibiendo mismo valor con los mismos espacios en blanco, sin saber por qué?

Actualizado

Adición método completo para un mejor contexto:

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.

+1

¿Qué espera el código para hacer y qué hace en su lugar? –

+0

String # trim() devuelve la cadena original si tiene una cadena vacía, por lo que no estoy seguro de que el condicional ternario sea necesario ... ¿Alguien quiere decirme si estoy equivocado? –

+0

@Michael: El código debe verificar si el valor es nulo y luego insertarlo como está en db y, si no es nulo, debe eliminar los espacios iniciales y finales y luego insertarlos. – Rachel

Respuesta

45

Actualización Parece que su espacio en blanco no es un espacio en blanco (ascii = 32). El suyo es con el código 160, que es un espacio sin interrupciones. trim() no lo maneja. Por lo que debe hacer algo como esto:

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

Será mejor que crear una utilidad - YourStringUtils.trim(string) y no realizar las dos operaciones - tanto .trim() y la replace(..)


Respuesta original:

Solo use this.poNumber = poNumber.trim();

Si hay e es una posibilidad para que poNumber sea null, luego puede usar el this.poNumber = StringUtils.trim(poNumber); seguro a cero desde commons-lang.

También puede usar trimToEmpty(..) de la misma clase, si desea que null se transforme en una cadena vacía.

Si no quiere depender de commons-lang, a continuación, sólo tiene que añadir una cláusula if-:

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

Como se señaló en los comentarios de la pregunta - asegurarse de que está mirando la variable justo después de el recorte. Debe verificar la variable de instancia. Su parámetro (o variable local, no puedo decirlo) no cambia, porque las cadenas son inmutables.

+0

Esto daría error ya que poNumber puede ser nulo en un archivo CSV. – Rachel

+1

@Rachel - Agregué una actualización sobre 'null'. Y su código también dará nulo – Bozho

+0

@Rachel Su código original daría el mismo error. Puede confundir Java con algún otro idioma. –

3

¿Estás seguro de que estás leyendo la variable correcta para tu salida? Usted tiene 'poNumber', que es la cadena sin recortar original, y 'this.poNumber', que obtendría la cadena recortada.

1

Su archivo puede tener espacios en blanco que no estén recortados. Por ejemplo, hay un espacio no disruptivo de caracteres Unicode (U + 00A0), que se visualiza como espacio en blanco pero no es considerado por trim (esto es algo que puede ver como en un documento editado en wordpad u otros editores que intentan "ayudar "usted"). Si observa la definición de String.trim(), elimina los caracteres que son < = '' (es decir, valor menor o igual a 20).

Imprima los valores de bytes de su cadena (o mírelos en un editor hexadecimal) y asegúrese de que sus espacios en realidad son espacios (es decir, el valor decimal 20). Si necesita otro comportamiento, es posible que necesite escribir su propia función de utilidad de recorte que utiliza una verificación Unicode Character.isWhiteSpace (char) unicode.

+0

cómo hacerlo, no estoy seguro acerca de cómo podemos imprimir los valores de código de bytes. – Rachel

+0

nota pequeña - "valor decimal 20" probablemente debería leer "valor decimal 32" o "valor hexadecimal 20" ... – weiresr

0

Puede utilizar esta función, hice algunas manipulaciones en el método java trim() y esto es mucho mejor, más rápido y más eficiente que algunos métodos 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; 
    } 
Cuestiones relacionadas