Usar Math.minasí evita una excepción en el caso de que la cadena ya sea más corta que 10.
Notas:
Lo anterior hace un recorte real. Si realmente desea reemplazar los últimos tres (!) Caracteres con puntos si se trunca, use Apache Commons StringUtils.abbreviate.
Esto puede comportarse incorrectamente 1 si su Cadena contiene puntos de código Unicode fuera del BMP; Ej. Emojis. Para obtener una solución (más complicada) que funcione correctamente para todos los puntos de código Unicode, consulte la solución de @ sibnick .
1 - Un punto de código Unicode que no está en el plano 0 (el BMP) se representa como un "par sustituto" (es decir, dos charvalores) en el String. Al ignorar esto, podríamos recortar a menos de 10 puntos de código, o (peor) truncar en el medio de un par sustituto. Por otro lado, String.length()ya no es una medida ideal de la longitud del texto Unicode, por lo que puede ser incorrecto recortar en función de ello.
En lugar de Math.min, ¿no podemos hacer una verificación condicional y hacer una subcadena solo si la cadena es máxima? por ejemplo:s = (s.length() > 10) ? s.substring(0,10) : s ;
RRAM
1
Sí por supuesto que puedes. ¡Lea las otras respuestas para conocer otras formas de resolver el problema!
Commons Lang3 incluso permite establecer una cadena personalizada como marcador de reemplazo. Con esto, por ejemplo, puede establecer puntos suspensivos de un solo carácter.
Podría ser, pero la pregunta del OP no pide "puntos suspensivos".
Stephen C
9
@StephenC: la pregunta muestra 8 caracteres seguidos de 2 puntos, dado un límite de longitud de 10, que se parece mucho a los puntos suspensivos (solo 2 puntos en lugar de 3). También es probable que muchas de las personas que encuentran esta pregunta consideren útil una elipsis.
ToolmakerSteve
12
... y si no quieres los puntos suspensivos, StringUtils.left () puede ayudarte.
Hay una StringUtilsfunción de Apache Commons que hace esto.
s =StringUtils.left(s,10)
Si los caracteres len no están disponibles, o la cadena es nula, la cadena se devolverá sin una excepción. Se devuelve una cadena vacía si len es negativo.
Puede ver la diferencia entre el código correcto y el código habitual en este ejemplo:
publicstaticvoid main(String[] args){//string with FACE WITH TEARS OF JOY symbolString s ="abcdafghi\uD83D\uDE02cdefg";int maxWidth =10;System.out.println(s);//do not care about UTF-16 surrogate pairsSystem.out.println(s.substring(0,Math.min(s.length(), maxWidth)));//correctly process UTF-16 surrogate pairsif(s.length()>maxWidth){int correctedMaxWidth =(Character.isLowSurrogate(s.charAt(maxWidth)))&&maxWidth>0? maxWidth-1: maxWidth;System.out.println(s.substring(0,Math.min(s.length(), correctedMaxWidth)));}}
Parece que está pidiendo un carácter de puntos suspensivos ( …) en último lugar, cuando se trunca. Aquí hay una línea para manipular su cadena de entrada.
String input ="abcdefghijkl";String output =( input.length()>10)// If too long…?
input
.substring(0,10-1)// Take just the first part, adjusting by 1 to replace that last character with an ellipsis..concat("…")// Add the ellipsis character.:// Or, if not too long…
input // Just return original string.;
Respuestas:
Usar
Math.min
así evita una excepción en el caso de que la cadena ya sea más corta que10
.Notas:
Lo anterior hace un recorte real. Si realmente desea reemplazar los últimos tres (!) Caracteres con puntos si se trunca, use Apache Commons
StringUtils.abbreviate
.Esto puede comportarse incorrectamente 1 si su Cadena contiene puntos de código Unicode fuera del BMP; Ej. Emojis. Para obtener una solución (más complicada) que funcione correctamente para todos los puntos de código Unicode, consulte la solución de @ sibnick .
1 - Un punto de código Unicode que no está en el plano 0 (el BMP) se representa como un "par sustituto" (es decir, dos
char
valores) en elString
. Al ignorar esto, podríamos recortar a menos de 10 puntos de código, o (peor) truncar en el medio de un par sustituto. Por otro lado,String.length()
ya no es una medida ideal de la longitud del texto Unicode, por lo que puede ser incorrecto recortar en función de ello.fuente
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviate
de la biblioteca Lang de Apache Commons podría ser tu amigo:Commons Lang3 incluso permite establecer una cadena personalizada como marcador de reemplazo. Con esto, por ejemplo, puede establecer puntos suspensivos de un solo carácter.
fuente
Hay una
StringUtils
función de Apache Commons que hace esto.StringUtils.Left JavaDocs
Cortesía: Steeve McCauley
fuente
Como de costumbre, a nadie le importan los pares sustitutos de UTF-16. Vea sobre ellos: ¿Cuáles son los caracteres Unicode no BMP más comunes en uso real? Incluso autores de org.apache.commons / commons-lang3
Puede ver la diferencia entre el código correcto y el código habitual en este ejemplo:
fuente
s = s.length() > 10 ? s.substring(0, 9) : s;
fuente
O simplemente puede usar este método en caso de que no tenga StringUtils a mano:
fuente
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
En caso de que esté buscando una forma de recortar y mantener los ÚLTIMOS 10 caracteres de una cadena.
fuente
Con Kotlin es tan simple como:
Documentación
fuente
tl; dr
Parece que está pidiendo un carácter de puntos suspensivos (
…
) en último lugar, cuando se trunca. Aquí hay una línea para manipular su cadena de entrada.Vea este código en vivo en IdeOne.com.
Operador ternario
Podemos hacer una línea usando el operador ternario .
Vea este código en vivo en IdeOne.com.
Flujos de Java
La instalación de Java Streams lo hace interesante, a partir de Java 9 y posterior. Interesante, pero quizás no sea el mejor enfoque.
Usamos puntos de código en lugar de
char
valores. Elchar
tipo es heredado y está limitado al subconjunto de todos los posibles caracteres Unicode .Si tuvimos caracteres en exceso truncados, reemplace el último carácter con puntos suspensivos .
Si tan solo pudiera pensar en una forma de juntar la línea de transmisión con la parte "si está por encima del límite, elípticos".
fuente
o,
Funciona con nulo.
fuente