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 ( String s="abcdafghijkl"
), la nouvelle chaîne tronquée contiendra "abcdefgh.."
.
Comment puis-je atteindre cet objectif?
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 ( String s="abcdafghijkl"
), la nouvelle chaîne tronquée contiendra "abcdefgh.."
.
Comment puis-je atteindre cet objectif?
Réponses:
s = s.substring(0, Math.min(s.length(), 10));
Utiliser Math.min
comme 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 char
valeurs) 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.
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviate
de la bibliothèque Apache Commons Lang pourrait être votre ami:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
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.
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
Il existe une StringUtils
fonction 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.
StringUtils.left (null, ) = null
StringUtils.left ( , -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left (" abc ", 2) =" ab "
StringUtils.left (" abc ", 4) =" abc "
Gracieuseté: Steeve McCauley
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:
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 vous pouvez simplement utiliser cette méthode au cas où vous n'avez pas StringUtils sous la main:
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));
Avec Kotlin, c'est aussi simple que:
yourString.take(10)
Renvoie une chaîne contenant les n premiers caractères de cette chaîne, ou la chaîne entière si cette chaîne est plus courte.
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 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
Voir ce code exécuté en direct sur IdeOne.com.
abcdefghi…
Nous pouvons faire un one-liner en utilisant l' opérateur ternaire .
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.
;
Voir ce code exécuté en direct sur IdeOne.com.
abcdefghi…
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. Le char
type est hérité et est limité au sous-ensemble de tous les caractères Unicode possibles .
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()
;
Si nous avions des caractères en excès tronqués, remplacez le dernier caractère par des points de suspension .
if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
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".