Utiliser Math.mincomme ceci évite une exception dans le cas où la chaîne est déjà plus courte que 10.
Remarques:
Ce qui précède fait une vraie coupe. Si vous souhaitez réellement remplacer les trois derniers caractères (!) Par des points si cela tronque, utilisez Apache Commons StringUtils.abbreviate.
Cela peut se comporter de manière incorrecte 1 si votre chaîne contient des points de code Unicode en dehors du BMP; par exemple Emojis. Pour une solution (plus compliquée) qui fonctionne correctement pour tous les points de code Unicode, voir la solution de @ sibnick .
1 - Un point de code Unicode qui n'est pas sur le plan 0 (le BMP) est représenté comme une "paire de substitution" (c'est-à-dire deux charvaleurs) dans le String. En ignorant cela, nous pourrions réduire à moins de 10 points de code, ou (pire) tronquer au milieu d'une paire de substitution. D'autre part, ce String.length()n'est plus une mesure idéale de la longueur du texte Unicode, donc le rognage en fonction de cela peut être la mauvaise chose à faire.
Au lieu de Math.min, ne pouvons-nous pas faire une vérification conditionnelle et faire une sous-chaîne uniquement si la chaîne est max alors requise? par exemple:s = (s.length() > 10) ? s.substring(0,10) : s ;
rram
1
Oui bien sûr, vous pouvez. Lisez les autres réponses pour découvrir d'autres moyens de résoudre le problème!
Commons Lang3 permet même de définir une chaîne personnalisée comme marqueur de remplacement. Avec cela, vous pouvez par exemple définir une seule ellipse de caractère.
C'est possible, mais la question du PO ne demande pas de "points de suspension".
Stephen C
9
@StephenC - La question montre 8 caractères suivis de 2 points, étant donné une longueur limite de 10, ce qui ressemble beaucoup à une ellipse (juste 2 points au lieu de 3). Il est également probable que de nombreuses personnes qui trouvent cette question considèrent qu'une ellipse est utile.
ToolmakerSteve
12
... et si vous ne voulez pas les points de suspension, alors StringUtils.left () peut vous aider.
Il existe une StringUtilsfonction Apache Commons qui fait cela.
s =StringUtils.left(s,10)
Si les caractères len ne sont pas disponibles ou si la chaîne est nulle, la chaîne sera renvoyée sans exception. Une chaîne vide est renvoyée si len est négatif.
Vous pouvez voir la différence entre le code correct et le code habituel dans cet exemple:
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)));}}
Vous semblez demander un caractère points de suspension ( …) à la dernière place, lors de la troncature. Voici une ligne unique pour manipuler votre chaîne d'entrée.
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.;
Non. De toute évidence, il veut couper la longueur de la corde si elle atteint une longueur de 11 ou plus. Vous devez travailler sur un nouveau système d'IA oO
JD333
1
@ JD333 Votre commentaire m'échappe. La troncature à une longueur de 10, y compris les points de suspension, est exactement ce que je montre ici.
Réponses:
Utiliser
Math.min
comme ceci évite une exception dans le cas où la chaîne est déjà plus courte que10
.Remarques:
Ce qui précède fait une vraie coupe. Si vous souhaitez réellement remplacer les trois derniers caractères (!) Par des points si cela tronque, utilisez Apache Commons
StringUtils.abbreviate
.Cela peut se comporter de manière incorrecte 1 si votre chaîne contient des points de code Unicode en dehors du BMP; par exemple Emojis. Pour une solution (plus compliquée) qui fonctionne correctement pour tous les points de code Unicode, voir la solution de @ sibnick .
1 - Un point de code Unicode qui n'est pas sur le plan 0 (le BMP) est représenté comme une "paire de substitution" (c'est-à-dire deux
char
valeurs) dans leString
. En ignorant cela, nous pourrions réduire à moins de 10 points de code, ou (pire) tronquer au milieu d'une paire de substitution. D'autre part, ceString.length()
n'est plus une mesure idéale de la longueur du texte Unicode, donc le rognage en fonction de cela peut être la mauvaise chose à faire.la source
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviate
de la bibliothèque Apache Commons Lang pourrait être votre ami:Commons Lang3 permet même de définir une chaîne personnalisée comme marqueur de remplacement. Avec cela, vous pouvez par exemple définir une seule ellipse de caractère.
la source
Il existe une
StringUtils
fonction Apache Commons qui fait cela.StringUtils.Left JavaDocs
Gracieuseté: Steeve McCauley
la source
Comme d'habitude, personne ne se soucie des paires de substituts UTF-16. Voir à leur sujet: Quels sont les caractères Unicode non BMP les plus couramment utilisés? Même les auteurs de org.apache.commons / commons-lang3
Vous pouvez voir la différence entre le code correct et le code habituel dans cet exemple:
la source
s = s.length() > 10 ? s.substring(0, 9) : s;
la source
Ou vous pouvez simplement utiliser cette méthode au cas où vous n'avez pas StringUtils sous la main:
la source
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
Juste au cas où vous cherchez un moyen de couper et de conserver les 10 DERNIERS caractères d'une chaîne.
la source
Avec Kotlin, c'est aussi simple que:
Documentation
la source
tl; dr
Vous semblez demander un caractère points de suspension (
…
) à la dernière place, lors de la troncature. Voici une ligne unique pour manipuler votre chaîne d'entrée.Voir ce code exécuté en direct sur IdeOne.com.
Opérateur ternaire
Nous pouvons faire un one-liner en utilisant l' opérateur ternaire .
Voir ce code exécuté en direct sur IdeOne.com.
Flux Java
La fonction Java Streams rend cela intéressant, à partir de Java 9 et versions ultérieures. Intéressant, mais peut-être pas la meilleure approche.
Nous utilisons des points de code plutôt que des
char
valeurs. Lechar
type est hérité et est limité au sous-ensemble de tous les caractères Unicode possibles .Si nous avions des caractères en excès tronqués, remplacez le dernier caractère par des points de suspension .
Si seulement je pouvais penser à un moyen de mettre en place la ligne de flux avec la partie "si la limite dépasse, faites des points de suspension".
la source
ou,
Fonctionne avec null.
la source