webentwicklung-frage-antwort-db.com.de

Wie kann ich einen NSString auf eine festgelegte Länge kürzen?

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?

65
nevan king

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.

119
mohsenr

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;
14
brandonscript

Eine kürzere Lösung ist:

NSString *shortString = ([myString length]>MINLENGTH ? [myString substringToIndex:MINLENGTH] : myString);
11
Phoenix

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)};
7
Shaggy Frog

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];
3
Alex Reynolds
 //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

2
Vinod Joshi

Die einfachste und schönste Lösung (mit 3 Punkten am Ende des Textes):

NSString *newText = [text length] > intTextLimit ? 
    [[text substringToIndex:intTextLimit] stringByAppendingString:@"..."] : 
        text;
2
Yossi

Schnell 4

let trimToCharacter = 20
let shortString = String(myString.prefix(trimToCharacter))

Glückliche Kodierung.

1

Wenn Sie vom Endgebrauch abschneiden möchten:

[fileName substringToIndex:anyNumber];

Wenn Sie von Anfang an abschneiden möchten:

[fileName substringFromIndex:anyNumber];
0
Gaurav

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.

0
Jon Shier