Quero cortar uma string se o comprimento exceder 10 caracteres.
Suponha que, se o comprimento da string for 12 ( String s="abcdafghijkl"), a nova string aparada contenha "abcdefgh..".
Como posso conseguir isso?
Quero cortar uma string se o comprimento exceder 10 caracteres.
Suponha que, se o comprimento da string for 12 ( String s="abcdafghijkl"), a nova string aparada contenha "abcdefgh..".
Como posso conseguir isso?
Respostas:
s = s.substring(0, Math.min(s.length(), 10));
Usar Math.mindesta forma evita uma exceção no caso em que a string já é menor que 10.
Notas:
O exemplo acima faz um corte real. Se você realmente deseja substituir os três últimos caracteres (!) Por pontos, se truncar, use o Apache Commons StringUtils.abbreviate.
Isso pode se comportar incorretamente 1 se sua String contiver pontos de código Unicode fora do BMP; por exemplo, Emojis. Para uma solução (mais complicada) que funciona corretamente para todos os pontos de código Unicode, consulte a solução da @ sibnick .
1 - Um ponto de código Unicode que não está no plano 0 (o BMP) é representado como um "par substituto" (ou seja, dois charvalores) no String. Ao ignorar isso, podemos reduzir para menos de 10 pontos de código ou (pior) truncar no meio de um par substituto. Por outro lado, String.length()não é mais uma medida ideal do tamanho do texto Unicode, portanto, aparar com base nela pode ser a coisa errada a fazer.
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviateda biblioteca Apache Commons Lang poderia ser seu amigo:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
O Commons Lang3 ainda permite definir uma String personalizada como marcador de substituição. Com isso, você pode, por exemplo, definir reticências de um único caractere.
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
Existe uma StringUtilsfunção Apache Commons que faz isso.
s = StringUtils.left(s, 10)
Se os caracteres len não estiverem disponíveis ou a String for nula, a String será retornada sem uma exceção. Uma String vazia será retornada se len for negativo.
StringUtils.left (null, ) = null
StringUtils.left ( , -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left () abc ", 2) =" ab "
StringUtils.left (" abc ", 4) =" abc "
Cortesia: Steeve McCauley
Como sempre, ninguém se importa com pares substitutos UTF-16. Veja sobre eles: Quais são os caracteres Unicode não BMP mais comuns em uso real? Até autores de org.apache.commons / commons-lang3
Você pode ver a diferença entre o código correto e o código usual neste exemplo:
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)));
}
}
Ou você pode simplesmente usar esse método caso não tenha o StringUtils disponível:
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));
Com o Kotlin, é tão simples quanto:
yourString.take(10)
Retorna uma sequência que contém os primeiros n caracteres dessa sequência ou a sequência inteira, se essa sequência for menor.
Você parece estar solicitando um caractere de reticências ( …) em último lugar, ao truncar. Aqui está uma linha para manipular sua sequência de entrada.
String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
Veja este código executado ao vivo em IdeOne.com.
abcdefghi…
Podemos criar uma linha usando o operador ternário .
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.
;
Veja este código executado ao vivo em IdeOne.com.
abcdefghi…
O recurso Java Streams torna isso interessante, a partir do Java 9 e posterior. Interessante, mas talvez não seja a melhor abordagem.
Usamos pontos de código em vez de charvalores. O chartipo é herdado e está limitado ao subconjunto de todos os caracteres Unicode possíveis .
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()
;
Se houver caracteres em excesso truncados, substitua o último caractere por uma elipse .
if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
Se ao menos eu conseguisse pensar em uma maneira de montar a linha do fluxo com a parte "se estiver acima do limite, faça reticências".