web-dev-qa-db-fra.com

Comment puis-je tronquer une chaîne NSString à une longueur définie?

J'ai cherché, mais étonnamment, je n'ai pas trouvé de réponse.

J'ai une longue NSString que je veux raccourcir. Je veux que la longueur maximale soit d'environ 20 caractères. J'ai lu quelque part que la meilleure solution consiste à utiliser substringWithRange. Est-ce le meilleur moyen de tronquer une chaîne? 

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];

Cela semble un peu délicat (se bloque si la corde est plus courte que la longueur maximale). Je ne suis pas sûr non plus que ce soit sans danger pour Unicode. Y a-t-il une meilleure façon de le faire? Quelqu'un at-il une catégorie Nice pour cela?

65
nevan king

En réalité, la partie sur la sécurité "Unicode" était morte, beaucoup de caractères se combinent en unicode, ce que les réponses suggérées ne prennent pas en compte.

Par exemple, si vous voulez taper é. Une façon de le faire est de taper "e" (0x65) + accent combiné "́" (0x301). Maintenant, si vous tapez "café" comme ceci et que vous tronquez 4 caractères, vous aurez "café". Cela pourrait causer des problèmes à certains endroits.

Si vous ne vous en souciez pas, les autres réponses fonctionnent très bien. Sinon, faites ceci:

// 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];

Notez que de cette manière, votre plage peut être plus longue que la longueur de votre plage initiale. Dans l'exemple de café ci-dessus, votre plage passera à 5, même s'il vous reste 4 "glyphes". Si vous devez absolument avoir une longueur inférieure à celle que vous avez indiquée, vous devez vérifier cela.

119
mohsenr

Puisque cette réponse ne figure pas dans cette liste, le one-liner le plus simple et le plus sensé:

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

Une solution plus courte est:

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

Cela semble un peu délicat (se bloque si la chaîne est plus courte que la longueur maximale)

Alors pourquoi ne pas en réparer cette partie?

NSRange stringRange = {0, MIN([myString length], 20)};
7
Shaggy Frog

Pourrait utiliser une opération ternaire:

NSString *shortString = (stringRange.length <= [myString length]) ? myString : [myString substringWithRange:stringRange];

Ou pour plus de contrôle sur le résultat final:

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

La solution la plus simple et agréable (avec 3 points à la fin du texte):

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

Swift 4

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

Bonne codage.

1
Md. Ibrahim Hassan

Si vous souhaitez tronquer à partir d'une utilisation finale:

[fileName substringToIndex:anyNumber];

Si vous voulez tronquer depuis le début:

[fileName substringFromIndex:anyNumber];
0
Gaurav

Toutes les opérations NSString sont compatibles avec Unicode, car NSString est essentiellement un tableau unichar en interne. Même si la chaîne est dans un codage différent, elle est convertie en votre codage spécifié lorsqu'elle est affichée.

0
Jon Shier