java - texto - ¿Por qué el recorte no funciona?
mascara de recorte invertida illustrator (4)
¿Estás seguro de que estás leyendo la variable correcta para tu salida? Tienes ''poNumber'', que es la cadena original sin recortar, y ''this.poNumber'', que obtendría la cadena recortada.
Estoy tratando de recortar los espacios en blanco iniciales de la cadena y no sé cuál es el problema con mi enfoque, ¿alguna sugerencia sería apreciada?
Código:
this.poNumber = poNumber.equals("") ? poNumber : poNumber.trim();
Estoy leyendo poNumber del archivo csv como "IG078565 e IG083060" y la salida también está obteniendo el mismo valor con los mismos espacios en blanco, ¿no estoy seguro de por qué?
Actualizado
Añadiendo 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.
Es posible que su archivo tenga espacios en blanco que no sean ASCII que no se estén recortando. Por ejemplo, hay un espacio de no ruptura de caracteres Unicode (U + 00A0), que se muestra como espacios en blanco pero no se considera por recorte (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, un valor menor o igual a 20).
Así que imprima los valores de bytes de su cadena (o mírelo en un editor hexadecimal) y asegúrese de que sus espacios sean realmente espacio (es decir, el valor decimal 20). Si necesita otro comportamiento, es posible que deba escribir su propia función de utilidad de recorte que utiliza un chequeo de Character.isWhiteSpace (char) de Unicode adecuado.
Podría usar esta función, hice algo de manipulación en el método java trim () y esto es mucho mejor, rápido y eficiente que algunos métodos reemplazar ().
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;
}
Actualizar Parece que su espacio en blanco no es un espacio en blanco (ascii = 32). Lo tuyo es con el código 160, que es un espacio sin ruptura. trim()
no lo maneja. Así que debes hacer algo como esto:
this.poNumber = poNumber.replace(String.valueOf((char) 160), " ").trim();
Será mejor que cree una utilidad, YourStringUtils.trim(string)
y allí realice las dos operaciones, tanto .trim()
como el replace(..)
Respuesta original:
Simplemente use this.poNumber = poNumber.trim();
Si existe la posibilidad de que poNumber
sea null
, entonces puede usar null-safe this.poNumber = StringUtils.trim(poNumber);
de commons-lang .
También puede usar trimToEmpty(..)
de la misma clase, si desea que null
se transforme en una cadena vacía.
Si no desea confiar en commons-lang, simplemente agregue una cláusula if:
if (poNumber != null) {
this.poNumber = poNumber.trim();
}
Como se indica en los comentarios de la pregunta, asegúrese de que está marcando la variable correcta después del recorte. Debe comprobar la variable de instancia. Su parámetro (o variable local, no puedo decirlo) no cambia, porque las cadenas son inmutables.