programing

NSS 문자열을 설정 길이로 자르는 방법은 무엇입니까?

muds 2023. 10. 23. 22:08
반응형

NSS 문자열을 설정 길이로 자르는 방법은 무엇입니까?

찾아봤지만, 놀랍게도 답을 찾을 수가 없었습니다.

나는 긴.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];

약간 섬세한 느낌이 듭니다(끈이 최대 길이보다 짧으면 충돌).유니코드가 안전한지도 잘 모르겠습니다.더 좋은 방법이 없을까요?이거 괜찮은 카테고리 있는 사람?

실제로 "유니코드 안전"에 대한 부분은 제안된 답변들이 고려하지 않는 유니코드로 많은 문자들이 결합되기 때문입니다.

예를 들어, é를 입력하려는 경우.한 가지 방법은 "e"(0x65)+combining accent " ́"(0x301)를 입력하는 것입니다.자, 이렇게 '카페'를 입력하고 4자 자르면 '카페'가 나옵니다.이로 인해 일부 지역에서 문제가 발생할 수 있습니다.

당신이 이것에 신경쓰지 않는다면, 다른 대답들은 잘 됩니다.그렇지 않으면 다음 작업을 수행합니다.

// 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개의 길이로 확장됩니다.반드시 표시한 길이보다 작은 길이가 필요하다면 이 부분을 확인해야 합니다.

스위프트 4

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

해피코딩.

이 답변은 실제로 이 목록에 없기 때문에, 가장 간단하고 합리적인 원 라인:

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)};

3차 연산을 사용할 수 있음:

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개가 있음):

NSString *newText = [text length] > intTextLimit ? 
    [[text substringToIndex:intTextLimit] stringByAppendingString:@"…"] : 
        text;
 //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

서로 다른 위치(머리, 꼬리 또는 가운데)에서 잘라내기 위한 확장입니다.

Swift 4.2 이상 버전

extension String {
    enum TruncationPosition {
        case head
        case middle
        case tail
    }

   func truncated(limit: Int, position: TruncationPosition = .tail, leader: String = "...") -> String {
        guard self.count >= limit else { return self }

        switch position {
        case .head:
            return leader + self.suffix(limit)
        
        case .middle:
            let halfCount = (limit - leader.count).quotientAndRemainder(dividingBy: 2)
            let headCharactersCount = halfCount.quotient + halfCount.remainder
            let tailCharactersCount = halfCount.quotient
            return String(self.prefix(headCharactersCount)) + leader + String(self.suffix(tailCharactersCount))
        
        case .tail:
            return self.prefix(limit) + leader
        }
    }
}

NSSstring은 기본적으로 내부적으로 유니캐리어 배열이기 때문에 모든 NSSstring 작업은 유니캐리어로 안전합니다.문자열이 다른 인코딩에 있더라도, 문자열이 표시되면 지정된 인코딩으로 변환됩니다.

최종 사용에서 잘라내기를 원하는 경우:

[fileName substringToIndex:anyNumber];

처음부터 잘라내기를 원하는 경우:

[fileName substringFromIndex:anyNumber];

언급URL : https://stackoverflow.com/questions/2952298/how-can-i-truncate-an-nsstring-to-a-set-length

반응형