Quiero recortar una cadena si la longitud supera los 10 caracteres.
Suponga que si la longitud de la cadena es 12 ( String s="abcdafghijkl"
), la nueva cadena recortada contendrá "abcdefgh.."
.
¿Cómo puedo conseguir esto?
Quiero recortar una cadena si la longitud supera los 10 caracteres.
Suponga que si la longitud de la cadena es 12 ( String s="abcdafghijkl"
), la nueva cadena recortada contendrá "abcdefgh.."
.
¿Cómo puedo conseguir esto?
Respuestas:
s = s.substring(0, Math.min(s.length(), 10));
Usar Math.min
así 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 char
valores) 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.
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviate
de la biblioteca Lang de Apache Commons podría ser tu amigo:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
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.
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
Hay una StringUtils
funció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.
StringUtils.left (null, ) = nulo
StringUtils.left ( , -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left (" abc ", 2) =" ab "
StringUtils.left (" abc ", 4) =" abc "
Cortesía: Steeve McCauley
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:
public static void main(String[] args) {
//string with FACE WITH TEARS OF JOY symbol
String s = "abcdafghi\uD83D\uDE02cdefg";
int maxWidth = 10;
System.out.println(s);
//do not care about UTF-16 surrogate pairs
System.out.println(s.substring(0, Math.min(s.length(), maxWidth)));
//correctly process UTF-16 surrogate pairs
if(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)));
}
}
O simplemente puede usar este método en caso de que no tenga StringUtils a mano:
public static String abbreviateString(String input, int maxLength) {
if (input.length() <= maxLength)
return input;
else
return input.substring(0, maxLength-2) + "..";
}
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
Con Kotlin es tan simple como:
yourString.take(10)
Devuelve una cadena que contiene los primeros n caracteres de esta cadena, o la cadena completa si esta cadena es más corta.
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 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
Vea este código en vivo en IdeOne.com.
abcdefghi ...
Podemos hacer una línea usando el operador ternario .
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.
;
Vea este código en vivo en IdeOne.com.
abcdefghi ...
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. El char
tipo es heredado y está limitado al subconjunto de todos los posibles caracteres Unicode .
String input = "abcdefghijkl" ;
int limit = 10 ;
String output =
input
.codePoints()
.limit( limit )
.collect( // Collect the results of processing each code point.
StringBuilder::new, // Supplier<R> supplier
StringBuilder::appendCodePoint, // ObjIntConsumer<R> accumulator
StringBuilder::append // BiConsumer<R,R> combiner
)
.toString()
;
Si tuvimos caracteres en exceso truncados, reemplace el último carácter con puntos suspensivos .
if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
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".