Durch die Verwendung Math.mindieser Option wird eine Ausnahme vermieden, wenn die Zeichenfolge bereits kürzer als ist 10.
Anmerkungen:
Das obige macht echtes Trimmen. Wenn Sie die letzten drei (!) Zeichen tatsächlich durch Punkte ersetzen möchten, wenn sie abgeschnitten werden, verwenden Sie Apache Commons StringUtils.abbreviate.
Dies kann sich falsch verhalten 1, wenn Ihre Zeichenfolge Unicode-Codepunkte außerhalb des BMP enthält. zB Emojis. Eine (kompliziertere) Lösung, die für alle Unicode-Codepunkte ordnungsgemäß funktioniert, finden Sie unter @ sibnicks Lösung .
1 - Ein Unicode-Codepunkt, der sich nicht auf Ebene 0 befindet (BMP), wird in der als "Ersatzpaar" (dh zwei charWerte) dargestellt String. Wenn wir dies ignorieren, können wir auf weniger als 10 Codepunkte zuschneiden oder (schlimmer) mitten in einem Ersatzpaar abschneiden. Auf der anderen Seite String.length()ist dies kein ideales Maß für die Unicode-Textlänge mehr. Daher kann das Zuschneiden basierend darauf die falsche Vorgehensweise sein.
Können wir anstelle von Math.min keine bedingte Prüfung durchführen und nur dann Teilzeichenfolgen ausführen, wenn die maximale Zeichenfolge dann erforderlich ist? zB:s = (s.length() > 10) ? s.substring(0,10) : s ;
rram
1
Natürlich kannst du. Lesen Sie die anderen Antworten, um das Problem auf andere Weise zu lösen!
Mit Commons Lang3 können Sie sogar einen benutzerdefinierten String als Ersatzmarker festlegen. Hiermit können Sie beispielsweise eine einzelne Auslassungsstelle festlegen.
Es könnte sein, aber die Frage des OP fragt nicht nach "Auslassungspunkten".
Stephen C
9
@StephenC - Die Frage zeigt 8 Zeichen, gefolgt von 2 Punkten bei einer Längenbeschränkung von 10, was einer Ellipse sehr ähnlich ist (nur 2 Punkte statt 3). Es ist auch wahrscheinlich, dass viele der Leute, die diese Frage finden, eine Ellipse als nützlich erachten.
ToolmakerSteve
12
... und wenn Sie die Auslassungspunkte nicht möchten, kann Ihnen StringUtils.left () helfen.
Wenn len Zeichen nicht verfügbar sind oder der String null ist, wird der String ausnahmslos zurückgegeben. Ein leerer String wird zurückgegeben, wenn len negativ ist.
In diesem Beispiel sehen Sie den Unterschied zwischen korrektem und normalem Code:
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)));}}
Gibt eine Zeichenfolge zurück, die die ersten n Zeichen dieser Zeichenfolge enthält, oder die gesamte Zeichenfolge, wenn diese Zeichenfolge kürzer ist.
Sie scheinen beim Abschneiden an letzter Stelle nach einem Auslassungszeichen ( …) zu fragen . Hier ist ein Einzeiler zum Bearbeiten Ihrer Eingabezeichenfolge.
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.;
Wenn ich mir nur eine Möglichkeit vorstellen könnte, die Stream-Linie mit dem Teil "Wenn das Limit überschritten wird, mache Auslassungspunkte" zusammenzusetzen.
Antworten:
Durch die Verwendung
Math.min
dieser Option wird eine Ausnahme vermieden, wenn die Zeichenfolge bereits kürzer als ist10
.Anmerkungen:
Das obige macht echtes Trimmen. Wenn Sie die letzten drei (!) Zeichen tatsächlich durch Punkte ersetzen möchten, wenn sie abgeschnitten werden, verwenden Sie Apache Commons
StringUtils.abbreviate
.Dies kann sich falsch verhalten 1, wenn Ihre Zeichenfolge Unicode-Codepunkte außerhalb des BMP enthält. zB Emojis. Eine (kompliziertere) Lösung, die für alle Unicode-Codepunkte ordnungsgemäß funktioniert, finden Sie unter @ sibnicks Lösung .
1 - Ein Unicode-Codepunkt, der sich nicht auf Ebene 0 befindet (BMP), wird in der als "Ersatzpaar" (dh zwei
char
Werte) dargestelltString
. Wenn wir dies ignorieren, können wir auf weniger als 10 Codepunkte zuschneiden oder (schlimmer) mitten in einem Ersatzpaar abschneiden. Auf der anderen SeiteString.length()
ist dies kein ideales Maß für die Unicode-Textlänge mehr. Daher kann das Zuschneiden basierend darauf die falsche Vorgehensweise sein.quelle
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviate
aus der Apache Commons Lang Bibliothek könnte dein Freund sein:Mit Commons Lang3 können Sie sogar einen benutzerdefinierten String als Ersatzmarker festlegen. Hiermit können Sie beispielsweise eine einzelne Auslassungsstelle festlegen.
quelle
Es gibt eine
StringUtils
Funktion, die dies tut.StringUtils.Left JavaDocs
Mit freundlicher Genehmigung von Steeve McCauley
quelle
Wie üblich kümmert sich niemand um UTF-16-Ersatzpaare. Siehe dazu: Was sind die am häufigsten verwendeten Nicht-BMP-Unicode-Zeichen? Sogar Autoren von org.apache.commons / commons-lang3
In diesem Beispiel sehen Sie den Unterschied zwischen korrektem und normalem Code:
quelle
s = s.length() > 10 ? s.substring(0, 9) : s;
quelle
Oder Sie können diese Methode einfach verwenden, wenn Sie StringUtils nicht zur Hand haben:
quelle
Nur für den Fall, dass Sie nach einer Möglichkeit suchen, die LETZTEN 10 Zeichen einer Zeichenfolge zu kürzen und beizubehalten.
quelle
Mit Kotlin ist es so einfach wie:
Dokumentation
quelle
tl; dr
Sie scheinen beim Abschneiden an letzter Stelle nach einem Auslassungszeichen (
…
) zu fragen . Hier ist ein Einzeiler zum Bearbeiten Ihrer Eingabezeichenfolge.Sehen Sie diesen Code live auf IdeOne.com.
Ternärer Operator
Mit dem ternären Operator können wir einen Einzeiler erstellen .
Sehen Sie diesen Code live auf IdeOne.com.
Java-Streams
Die Java Streams-Funktion macht dies ab Java 9 und höher interessant. Interessant, aber vielleicht nicht der beste Ansatz.
Wir verwenden Codepunkte anstelle von
char
Werten. Derchar
Typ ist Legacy und beschränkt sich auf eine Teilmenge aller möglichen Unicode- Zeichen.Wenn überschüssige Zeichen abgeschnitten wurden, ersetzen Sie das letzte Zeichen durch ein Auslassungszeichen .
Wenn ich mir nur eine Möglichkeit vorstellen könnte, die Stream-Linie mit dem Teil "Wenn das Limit überschritten wird, mache Auslassungspunkte" zusammenzusetzen.
quelle
oder,
Funktioniert mit null.
quelle