検索しましたが、驚くべきことに答えが見つかりませんでした。
短くしたいNSString
が長いです。最大長を20文字程度にしたい。 substringWithRange
を使用することが最善の解決策であるとどこかで読みました。これは文字列を切り捨てる最良の方法ですか?
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];
少し繊細なようです(文字列が最大長より短い場合はクラッシュします)。また、Unicodeが安全かどうかもわかりません。それを行うためのより良い方法はありますか?誰にもこれにいいカテゴリがありますか?
実際、多くの文字がユニコードで組み合わされているため、提案された回答では考慮されていないため、「ユニコードセーフ」についての部分は死んでいた。
たとえば、éを入力する場合。その方法の1つは、「e」(0x65)+アクセント記号の組み合わせ「́」(0x301)と入力することです。これで、「cafe」と入力して4文字を切り捨てると、「cafe」になります。これはいくつかの場所で問題を引き起こす可能性があります。
これを気にしない場合、他の答えはうまくいきます。それ以外の場合、これを行います:
// 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];
この方法では、範囲が初期範囲の長さより長くなる可能性があることに注意してください。上記のカフェの例では、4つの「グリフ」がまだあるにもかかわらず、範囲は5の長さに拡張されます。指定した長さよりも短くする必要がある場合は、これを確認する必要があります。
この答えは実際にはこのリストにないため、最も単純で最も賢明なワンライナー:
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;
より短い解決策は次のとおりです。
NSString *shortString = ([myString length]>MINLENGTH ? [myString substringToIndex:MINLENGTH] : myString);
少し繊細なようです(文字列が最大長より短い場合はクラッシュします)
次に、その部分を修正してみませんか?
NSRange stringRange = {0, MIN([myString length], 20)};
三項演算を使用できます:
NSString *shortString = (stringRange.length <= [myString length]) ? myString : [myString substringWithRange:stringRange];
または、最終結果をさらに制御するには:
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
最もシンプルで素敵なソリューション(テキストの最後に3つのドットがあります):
NSString *newText = [text length] > intTextLimit ?
[[text substringToIndex:intTextLimit] stringByAppendingString:@"..."] :
text;
let trimToCharacter = 20
let shortString = String(myString.prefix(trimToCharacter))
ハッピーコーディング。
最終用途から切り捨てる場合:
[fileName substringToIndex:anyNumber];
最初から切り捨てる場合:
[fileName substringFromIndex:anyNumber];
NSStringは基本的に内部的にunichar配列であるため、すべてのNSString操作はUnicodeセーフです。文字列が別のエンコーディングにある場合でも、表示時に指定したエンコーディングに変換されます。