Voglio tagliare una stringa se la lunghezza supera i 10 caratteri.
Supponiamo che la lunghezza della stringa sia 12 ( String s="abcdafghijkl"
), conterrà la nuova stringa tagliata "abcdefgh.."
.
Come posso raggiungere questo obiettivo?
Voglio tagliare una stringa se la lunghezza supera i 10 caratteri.
Supponiamo che la lunghezza della stringa sia 12 ( String s="abcdafghijkl"
), conterrà la nuova stringa tagliata "abcdefgh.."
.
Come posso raggiungere questo obiettivo?
Risposte:
s = s.substring(0, Math.min(s.length(), 10));
L'uso in Math.min
questo modo evita un'eccezione nel caso in cui la stringa sia già più corta di 10
.
Appunti:
Quanto sopra fa il vero taglio. Se vuoi effettivamente sostituire gli ultimi tre (!) Caratteri con punti se si tronca, usa Apache Commons StringUtils.abbreviate
.
Ciò potrebbe comportarsi in modo errato 1 se la stringa contiene codici codificati Unicode all'esterno del BMP; ad esempio Emoji. Per una soluzione (più complicata) che funzioni correttamente per tutti i punti di codice Unicode, vedere la soluzione di @ sibnick .
1 - Un punto di codice Unicode che non si trova sul piano 0 (BMP) è rappresentato come una "coppia surrogata" (cioè due char
valori) in String
. Ignorando questo, potremmo tagliare a meno di 10 punti di codice, o (peggio) troncare nel mezzo di una coppia surrogata. D'altra parte, String.length()
non è più una misura ideale della lunghezza del testo Unicode, quindi il taglio basato su di esso potrebbe essere la cosa sbagliata da fare.
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviate
dalla biblioteca Lang di Apache Commons potrebbe essere tuo amico:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
Commons Lang3 consente persino di impostare una stringa personalizzata come marker di sostituzione. Con questo puoi ad esempio impostare un puntino di sospensione a singolo carattere.
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
C'è una StringUtils
funzione di Apache Commons che lo fa.
s = StringUtils.left(s, 10)
Se i caratteri len non sono disponibili o la stringa è nulla, la stringa verrà restituita senza eccezioni. Viene restituita una stringa vuota se len è negativo.
StringUtils.left (null, ) = null
StringUtils.left ( , -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left (" abc ", 2) =" ab "
StringUtils.left (" abc ", 4) =" abc "
Per gentile concessione: Steeve McCauley
Come al solito a nessuno importa delle coppie surrogate UTF-16. Vedi di loro: Quali sono i caratteri Unicode non BMP più comuni attualmente in uso? Perfino autori di org.apache.commons / commons-lang3
In questo esempio puoi vedere la differenza tra il codice corretto e il solito codice:
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)));
}
}
Oppure puoi semplicemente usare questo metodo nel caso in cui StringUtils non sia a portata di mano:
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));
Con Kotlin è semplice come:
yourString.take(10)
Restituisce una stringa contenente i primi n caratteri di questa stringa o l'intera stringa se questa stringa è più corta.
Sembra che tu stia chiedendo un carattere di puntino di sospensione ( …
) nell'ultimo posto, quando troncati. Ecco un one-liner per manipolare la tua stringa di input.
String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
Vedi questo codice eseguito dal vivo su IdeOne.com.
abcdefghi ...
Siamo in grado di creare un one-liner usando l' operatore ternario .
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.
;
Vedi questo codice eseguito dal vivo su IdeOne.com.
abcdefghi ...
La funzione Java Streams lo rende interessante, a partire da Java 9 e versioni successive. Interessante, ma forse non è l'approccio migliore.
Utilizziamo i punti di codice anziché i char
valori. Il char
tipo è legacy ed è limitato al sottoinsieme di tutti i possibili caratteri Unicode .
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 abbiamo troncato i caratteri in eccesso, sostituisci l'ultimo carattere con i puntini di sospensione .
if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
Se solo potessi pensare a un modo per mettere insieme la linea di flusso con la parte "if over limit, do ellipsis".