Couper une chaîne en fonction de la longueur de la chaîne

Je veux couper une chaîne si la longueur dépasse 10 caractères.

Supposons que si la longueur de la chaîne est 12 ( Ssortingng s="abcdafghijkl" ), la nouvelle chaîne Ssortingng s="abcdafghijkl" contiendra "abcdefgh.." .

Comment puis-je atteindre cet objective?

 s = s.subssortingng(0, Math.min(s.length(), 10)); 

Utiliser Math.min comme ceci évite une exception dans le cas où la chaîne est déjà inférieure à 10 .


Remarques:

  1. Ce qui précède fait une réelle coupe. Si vous voulez réellement remplacer les trois derniers caractères (!) Par des points s’il tronque, utilisez Apache Commons SsortingngUtils.abbreviate .

  2. Cela peut se comporter incorrectement 1 si votre chaîne contient des points de code Unicode en dehors du BMP; par exemple les emojis. Pour une solution qui fonctionne correctement pour tous les points de code Unicode, voir la solution @ sibnick.


1 – Un sharepoint code Unicode qui n’est pas sur le plan 0 (le BMP) est représenté par une “paire de substitution” (c’est-à-dire deux valeurs de caractère) dans la Ssortingng . En ignorant cela, nous pouvons réduire à moins de 10 points de code, ou (pire) tronquer au milieu d’une paire de substitution. D’autre part, Ssortingng.length() n’est plus une mesure idéale de la longueur du texte Unicode, par conséquent le découpage basé sur celui-ci peut être une mauvaise chose à faire.

SsortingngUtils.abbreviate de la bibliothèque Apache Commons Lang pourrait être votre ami:

 SsortingngUtils.abbreviate("abcdefg", 6) = "abc..." SsortingngUtils.abbreviate("abcdefg", 7) = "abcdefg" SsortingngUtils.abbreviate("abcdefg", 8) = "abcdefg" SsortingngUtils.abbreviate("abcdefg", 4) = "a..." 

Il existe une fonction SsortingngUtils qui fait cela.

 s = SsortingngUtils.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.

SsortingngUtils.left (null, ) = null
SsortingngUtils.left ( , -ve) = “”
SsortingngUtils.left (“”, *) = “”
SsortingngUtils.left (“abc”, 0) = “”
SsortingngUtils.left (“abc”, 2) = “ab”
SsortingngUtils.left (“abc”, 4) = “abc”

SsortingngUtils.Left JavaDocs

Gracieuseté de Steeve McCauley

Comme d’habitude, personne ne se soucie des paires de substitution UTF-16. Voir à leur sujet: Quels sont les caractères Unicode non-BMP les plus courants en utilisation réelle? 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:

 public static void main(Ssortingng[] args) { //ssortingng with FACE WITH TEARS OF JOY symbol Ssortingng s = "abcdafghi\uD83D\uDE02cdefg"; int maxWidth = 10; System.out.println(s); //do not care about UTF-16 surrogate pairs System.out.println(s.subssortingng(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.subssortingng(0, Math.min(s.length(), correctedMaxWidth))); } } 

s = s.length() > 10 ? s.subssortingng(0, 9) : s;

Ou vous pouvez simplement utiliser cette méthode si vous ne disposez pas de SsortingngUtils:

 public static Ssortingng abbreviateSsortingng(Ssortingng input, int maxLength) { if (input.length() < = maxLength) return input; else return input.substring(0, maxLength-2) + ".."; } 

Juste au cas où vous chercheriez un moyen de couper et de garder les 10 DERNIERS caractères d’une chaîne.

 s = s.subssortingng(Math.max(s.length(),10) - 10); 
 str==null ? str : str.subssortingng(0, Math.min(str.length(), 10)) 

ou,

 str==null ? "" : str.subssortingng(0, Math.min(str.length(), 10)) 

Fonctionne avec null.