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
'programing' 카테고리의 다른 글
브라우저에 마우스가 없고 터치 전용임을 감지 (0) | 2023.10.23 |
---|---|
구조물의 함수 (0) | 2023.10.23 |
Wordpress 사이트에 대한 도메인 마스킹이 있는 htaccess 리디렉션이 작동하지 않습니다. (0) | 2023.10.23 |
A1에서 실제 사용한 셀까지의 범위를 반환합니다. (0) | 2023.10.23 |
MySQL Views - 사용 시기 및 사용하지 않는 시기 (0) | 2023.10.23 |