web-dev-qa-db-ja.com

NSStringを設定された長さに切り捨てるにはどうすればよいですか?

検索しましたが、驚くべきことに答えが見つかりませんでした。

短くしたい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が安全かどうかもわかりません。それを行うためのより良い方法はありますか?誰にもこれにいいカテゴリがありますか?

65
nevan king

実際、多くの文字がユニコードで組み合わされているため、提案された回答では考慮されていないため、「ユニコードセーフ」についての部分は死んでいた。

たとえば、éを入力する場合。その方法の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の長さに拡張されます。指定した長さよりも短くする必要がある場合は、これを確認する必要があります。

120
mohsenr

この答えは実際にはこのリストにないため、最も単純で最も賢明なワンライナー:

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

より短い解決策は次のとおりです。

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

少し繊細なようです(文字列が最大長より短い場合はクラッシュします)

次に、その部分を修正してみませんか?

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

三項演算を使用できます:

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

最もシンプルで素敵なソリューション(テキストの最後に3つのドットがあります):

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

スイフト4

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

ハッピーコーディング。

2

最終用途から切り捨てる場合:

[fileName substringToIndex:anyNumber];

最初から切り捨てる場合:

[fileName substringFromIndex:anyNumber];
0
Gaurav

NSStringは基本的に内部的にunichar配列であるため、すべてのNSString操作はUnicodeセーフです。文字列が別のエンコーディングにある場合でも、表示時に指定したエンコーディングに変換されます。

0
Jon Shier