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?
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.
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;
Une solution plus courte est:
NSString *shortString = ([myString length]>MINLENGTH ? [myString substringToIndex:MINLENGTH] : myString);
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)};
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];
//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
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;
let trimToCharacter = 20
let shortString = String(myString.prefix(trimToCharacter))
Bonne codage.
Si vous souhaitez tronquer à partir d'une utilisation finale:
[fileName substringToIndex:anyNumber];
Si vous voulez tronquer depuis le début:
[fileName substringFromIndex:anyNumber];
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.