70 votes

Comment tronquer un NSString à un réglage de la longueur?

J'ai cherché, mais, étonnamment, ne pouvait pas trouver une réponse.

J'ai une longue NSString que je veux abréger. Je veux que la longueur maximum de 20 caractères. J'ai lu quelque part que la meilleure solution est d'utiliser substringWithRange. Est-ce la meilleure façon de tronquer une chaîne de caractères?

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

Il semble un peu délicate (se bloque si la chaîne est plus courte que la longueur maximale). Je ne suis pas sûr si c'est de l'Unicode-fort. Est-il un meilleur moyen de le faire? Quelqu'un aurait-il un gentil catégorie pour cela?

123voto

mohsenr Points 5433

En fait la partie de "Unicode sûr" était mort, autant de caractères combiner en unicode qui le corrigé de ne pas prendre en compte.

Par exemple, si vous voulez taper é. Une façon de le faire est de taper "e"(0x65)+combinant accent" "(0x301). Maintenant, si vous tapez "café" de ce genre et de les tronquer les 4 caractères, vous obtiendrez un "café". Cela pourrait causer des problèmes à certains endroits.

Si vous ne vous inquiétez pas à ce sujet, d'autres réponses, beau travail. 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 façon, votre gamme pourrait être plus longue que votre initiale de la longueur de la gamme. Dans le café de l'exemple ci-dessus, votre gamme sera étendue à une longueur de 5, même si vous avez encore 4 "glyphes". Si vous avez absolument besoin d'avoir une durée de moins que ce que vous avez indiqué, vous avez besoin de vérifier cela.

15voto

remus Points 6305

Depuis cette réponse n'est pas dans cette liste, la plus simple et la plus sensible one-liner:

NSString *myString = @"This is a string, it's a very long string, it's a very long string indeed";
myString = [myString substringToIndex:20];

11voto

Phoenix Points 31

Une solution plus courte est:

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

7voto

Shaggy Frog Points 20388

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

Alors pourquoi ne pas remédier à ce problème?

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

3voto

Alex Reynolds Points 45039

Pourrait utiliser un ternaire de l'opération:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X