Ich suchte, fand aber überraschenderweise keine Antwort.
Ich habe eine lange NSString
, die ich abkürzen möchte. Ich möchte, dass die maximale Länge etwa 20 Zeichen beträgt. Ich habe irgendwo gelesen, dass die beste Lösung substringWithRange
ist. Ist dies der beste Weg, um eine Zeichenfolge abzuschneiden?
NSRange stringRange = {0,20};
NSString *myString = @"This is a string, it's a very long string, it's a very long string indeed";
NSString *shortString = [myString substringWithRange:stringRange];
Es scheint ein wenig empfindlich (stürzt ab, wenn die Zeichenfolge kürzer als die maximale Länge ist). Ich bin mir auch nicht sicher, ob es Unicode-sicher ist. Gibt es einen besseren Weg, dies zu tun? Hat jemand eine Nizza Kategorie dafür?
Tatsächlich war der Teil, "Unicode-Safe" zu sein, tot, da sich viele Zeichen in Unicode kombinieren, was die vorgeschlagenen Antworten nicht berücksichtigen.
Zum Beispiel, wenn Sie é eingeben möchten. Eine Möglichkeit, dies zu tun, besteht darin, "e" (0x65) + den Akzent "́" (0x301) einzugeben. Wenn Sie jetzt "café" eingeben und 4 Zeichen abschneiden, erhalten Sie "café". Dies kann an einigen Stellen zu Problemen führen.
Wenn Sie sich nicht darum kümmern, funktionieren andere Antworten gut. Ansonsten mache das:
// define the range you're interested in
NSRange stringRange = {0, MIN([myString length], 20)};
// adjust the range to include dependent chars
stringRange = [myString rangeOfComposedCharacterSequencesForRange:stringRange];
// Now you can create the short string
NSString *shortString = [myString substringWithRange:stringRange];
Beachten Sie, dass Ihr Bereich auf diese Weise länger sein kann als Ihre ursprüngliche Bereichslänge. Im obigen Café-Beispiel wird Ihr Bereich auf eine Länge von 5 erweitert, obwohl Sie noch 4 "Glyphen" haben. Wenn Sie unbedingt eine kürzere Länge als angegeben benötigen, müssen Sie dies überprüfen.
Da diese Antwort eigentlich nicht in dieser Liste enthalten ist, ist dies der einfachste und sinnvollste Einzeiler:
NSString *myString = @"This is a string, it's a very long string, it's a very long string indeed";
myString = (myString.length > 20) ? [myString substringToIndex:20] : myString;
Eine kürzere Lösung ist:
NSString *shortString = ([myString length]>MINLENGTH ? [myString substringToIndex:MINLENGTH] : myString);
Es scheint ein wenig empfindlich (stürzt ab, wenn die Zeichenfolge kürzer als die maximale Länge ist)
Warum dann diesen Teil nicht reparieren?
NSRange stringRange = {0, MIN([myString length], 20)};
Könnte eine ternäre Operation verwenden:
NSString *shortString = (stringRange.length <= [myString length]) ? myString : [myString substringWithRange:stringRange];
Oder für mehr Kontrolle über das Endergebnis:
if (stringRange.length > [myString length])
// throw exception, ignore error, or set shortString to myString
else
shortString = [myString substringWithRange:stringRange];
//Short the string if string more than 45 chars
if([self.tableCellNames[indexPath.section] length] > 40) {
// define the range you're interested in
NSRange stringRange = {0, MIN([self.tableCellNames[indexPath.section] length], 40)};
// adjust the range to include dependent chars
stringRange = [self.tableCellNames[indexPath.section]
rangeOfComposedCharacterSequencesForRange:stringRange];
// Now you can create the short string
NSString *shortStringTitle = [self.tableCellNames[indexPath.section] substringWithRange:stringRange];
shortStringTitle = [shortStringTitle stringByAppendingString:@"..."];
titleLabel.text = shortStringTitle;
} else {
titleLabel.text = self.tableCellNames[indexPath.section];
}
// VKJ
Die einfachste und schönste Lösung (mit 3 Punkten am Ende des Textes):
NSString *newText = [text length] > intTextLimit ?
[[text substringToIndex:intTextLimit] stringByAppendingString:@"..."] :
text;
let trimToCharacter = 20
let shortString = String(myString.prefix(trimToCharacter))
Glückliche Kodierung.
Wenn Sie vom Endgebrauch abschneiden möchten:
[fileName substringToIndex:anyNumber];
Wenn Sie von Anfang an abschneiden möchten:
[fileName substringFromIndex:anyNumber];
Alle NSString-Vorgänge sind Unicode-sicher, da NSString im Wesentlichen ein unichares Array ist. Auch wenn sich die Zeichenfolge in einer anderen Kodierung befindet, wird sie bei der Anzeige in Ihre angegebene Kodierung konvertiert.