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.min
desta 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 char
valores) 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.abbreviate
da 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 StringUtils
funçã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 char
valores. O char
tipo é 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".