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.
Em vez de Math.min, não podemos fazer uma verificação condicional e fazer substring apenas se a string for max, em seguida, necessária? por exemplo:s = (s.length() > 10) ? s.substring(0,10) : s ;
rram 14/02/19
1
Sim, é claro que você pode. Leia as outras respostas para outras maneiras de resolver o problema!
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.
Poderia ser, mas a pergunta do OP não pede "reticências".
Stephen C
9
@StephenC - A pergunta mostra 8 caracteres seguidos por 2 pontos, dado um limite de comprimento de 10, que é muito parecido com uma elipse (apenas 2 pontos em vez de 3). Também é provável que muitas das pessoas que acham essa pergunta considerem uma elipse útil.
Página Inicial>
12
... e se você não deseja as reticências, o StringUtils.left () pode ajudá-lo.
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.
Você pode ver a diferença entre o código correto e o código usual neste exemplo:
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)));}}
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)// 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.;
Não. Claramente, ele deseja cortar o comprimento da corda se ela atingir um comprimento de 11 ou mais. Você deve estar trabalhando em um novo sistema AI oO
JD333 2/19/19
1
@ JD333 Seu comentário me escapa. Truncar até 10, incluindo as reticências, é exatamente o que mostro aqui.
Respostas:
Usar
Math.min
desta forma evita uma exceção no caso em que a string já é menor que10
.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) noString
. 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.fonte
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviate
da biblioteca Apache Commons Lang poderia ser seu amigo: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.
fonte
Existe uma
StringUtils
função Apache Commons que faz isso.StringUtils.Left JavaDocs
Cortesia: Steeve McCauley
fonte
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:
fonte
s = s.length() > 10 ? s.substring(0, 9) : s;
fonte
Ou você pode simplesmente usar esse método caso não tenha o StringUtils disponível:
fonte
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
Caso você esteja procurando uma maneira de aparar e manter os ÚLTIMOS 10 caracteres de uma string.
fonte
Com o Kotlin, é tão simples quanto:
Documentação
fonte
tl; dr
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.Veja este código executado ao vivo em IdeOne.com.
Operador ternário
Podemos criar uma linha usando o operador ternário .
Veja este código executado ao vivo em IdeOne.com.
Fluxos Java
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. Ochar
tipo é herdado e está limitado ao subconjunto de todos os caracteres Unicode possíveis .Se houver caracteres em excesso truncados, substitua o último caractere por uma elipse .
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".
fonte
ou,
Funciona com nulo.
fonte