2010-03-12 2 views
34

나는 이미 문장의 모든 단어를 대문자로 시작하는 방법을 찾았지만 첫 단어 만 대문자로 표시하지는 않았다.Objective-C에서 문장의 첫 단어를 어떻게 대문자로 만드시겠습니까?

NSString *txt [email protected]"hi my friends!" 
[txt capitalizedString]; 

저는 소문자로 변경하고 첫 번째 문자를 대문자로 바꾸고 싶지 않습니다. 나는 다른 사람들의 변화없이 첫 번째 단어를 대문자로하고 싶습니다.

답변

118
여기

또 다른는 그것을 이동 :

NSString *txt = @"hi my friends!"; 
txt = [txt stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[txt substringToIndex:1] uppercaseString]]; 

스위프트 언어에 대해 :

txt.replaceRange(txt.startIndex...txt.startIndex, with: String(txt[txt.startIndex]).capitalizedString) 
+0

완벽하게 작동합니다 !!!!!!!!!! Tks – wal

+9

문자열의 길이가 항상 1 자 이상이어야하며 그렇지 않은 경우 throw 된 예외를 처리 할 준비가되었는지 확인하십시오. –

+0

문자열을 대문자로 바꾸기 전에 if ([txt length]> 1) 확인을 추가하십시오. – looneydoodle

8
사용

- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator 

및 배열의 ​​첫 번째 개체를 대문자로 다음 다시

+1

나는 Objective-c와는 꽤 외계인이지만 단어를 대문자로 사용하려면 너무 많이해야합니까 ?? –

+1

예, 첫 단어 만 대문자로 표시합니다. 불행히도, Objective-C는 모든 작업을 한 줄에서 수행 할 수있는 Python과 다릅니다. –

+0

@Teja : NSString은 문자열에서 단 하나의 "단어"에 대해 뭔가를 수행하는 것을 기본적으로 지원하지 않으며 어쨌든 매우 자세한 언어입니다. 그렇습니다. – Chuck

0

옵션을 가진을 위해서 그들과 합류하기 위해

- (NSString *)componentsJoinedByString:(NSString *)separator 

를 사용, 난 좋을 것 :

NSString *myString = [NSString stringWithFormat:@"this is a string..."]; 

char *tmpStr = calloc([myString length] + 1,sizeof(char)); 

[myString getCString:tmpStr maxLength:[myString length] + 1 encoding:NSUTF8StringEncoding]; 

int sIndex = 0; 

/* skip non-alpha characters at beginning of string */ 
while (!isalpha(tmpStr[sIndex])) { 
    sIndex++; 
} 

toupper(tmpStr[sIndex]); 

myString = [NSString stringWithCString:tmpStr encoding:NSUTF8StringEncoding]; 

저는 직장에있어 이걸 테스트 할 맥을 가지고 있지 않지만, 정확하게 기억하면 을 반환하기 때문에 [myString cStringUsingEncoding:NSUTF8StringEncoding]을 사용할 수 없습니다.

3
pString = [pString 
      stringByReplacingCharactersInRange:NSMakeRange(0,1) 
      withString:[[pString substringToIndex:1] capitalizedString]]; 
15

허용 된 대답은 잘못된 것입니다. 첫째, 사용자가 예상하는 의미에서 "문자"로 NSString의 단위를 처리하는 것은 올바르지 않습니다. 서로 게이트 쌍이 있습니다. 결합 순서가 있습니다. 이들을 분할하면 잘못된 결과가 발생합니다. 둘째로, 반드시 첫 번째 문자를 대문자로 사용하는 것이 그 문자를 포함하는 단어를 대문자로 사용하는 것과 동일한 결과를 산출하는 것은 아닙니다. 언어는 문맥에 민감 할 수 있습니다.

이 작업을 수행하는 올바른 방법은 프레임 워크에서 로케일에 적합한 방식으로 단어 (또는 가능한 문장)를 식별하도록하는 것입니다. 또한 로케일에 적합한 방식으로 자본화합니다.

[aMutableString enumerateSubstringsInRange:NSMakeRange(0, [aMutableString length]) 
            options:NSStringEnumerationByWords | NSStringEnumerationLocalized 
           usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
    [aMutableString replaceCharactersInRange:substringRange 
            withString:[substring capitalizedStringWithLocale:[NSLocale currentLocale]]]; 
    *stop = YES; 
}]; 

그것은 문자열의 첫 번째 단어가 문자열의 첫 번째 문장의 첫 단어와 동일하지 않습니다 가능성이 있습니다. 문자열의 첫 번째 (또는 각) 문장을 확인한 다음 그 중 첫 번째 단어 (또는 그 단어)를 대문자로 바꾸려면 -enumerateSubstringsInRange:options:usingBlock:의 외부 호출에서 위의 내용을 NSStringEnumerationBySentences | NSStringEnumerationLocalized을 사용하여 묶으십시오. 내부 호출에서 외부 호출에 의해 제공된 substringRange을 범위 인수로 전달하십시오.

+0

모든 단어의 첫 글자를 대문자로 쓰고 싶다면 마지막 줄을'* stop = enclosingRange.location + enclosingRange.length == self.length; '로 바꾸십시오. –

+2

모든 단어를 대문자로 바꾸려면, 그러면 단어로 열거 할 필요가 전혀 없습니다. 이것이'-capitalizedStringWithLocale :'의 기본 동작입니다. 모든 단어를 열거하길 원한다고해도, 그 일을하는 방법은 절대 멈추지 않는 것입니다. 열거 형은 문자열 끝에 자연스럽게 끝납니다. (일반적으로 Cocoa의 enumeration-with-block 메서드에서는 true로 설정하지 않는 한'* stop'을 설정하지 말아야합니다. 이것은 동시 열거 형에서 주로 중요하지만 모든 경우에 대해 디자인 계약에 있습니다.) –

+1

받아 들인 답이 되십시오. – Warpling

0

이 확장을 사용하여 다음과 같이 할 수있어 신속한에서이처럼 문자열을 호출

extension String { 
    func ucfirst() -> String { 
     return (self as NSString).stringByReplacingCharactersInRange(NSMakeRange(0, 1), withString: (self as NSString).substringToIndex(1).uppercaseString) 
    }  
} 

을 : 당신은 정규 표현식을 가지고있는 사용자 내가 나를 위해 그것을 작품을했을 수

var ucfirstString:String = "test".ucfirst() 
1

간단한 아래 코드를 붙여 넣을 수 있습니다 + (NSString *) CaptializeFirstCharacterOfSentence : (NSString *) 문장 {

NSMutableString *firstCharacter = [sentence mutableCopy]; 
NSString *pattern = @"(^|\\.|\\?|\\!)\\s*(\\p{Letter})"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL]; 
[regex enumerateMatchesInString:sentence options:0 range:NSMakeRange(0, [sentence length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
    //NSLog(@"%@", result); 
    NSRange r = [result rangeAtIndex:2]; 
    [firstCharacter replaceCharactersInRange:r withString:[[sentence substringWithRange:r] uppercaseString]]; 
}]; 
NSLog(@"%@", firstCharacter); 
return firstCharacter; 

} //이 메서드를 호출하십시오. NsString * resultSentence = [UserClass CaptializeFirstCharacterOfSentence : yourTexthere];

0

스위프트의 대안 솔루션 :

var str = "hello" 

if count(str) > 0 { 
    str.splice(String(str.removeAtIndex(str.startIndex)).uppercaseString, atIndex: str.startIndex) 
} 
0

내가 알고있는 질문은 그러나 여기, 오브젝티브 C 응답을 위해 특별히 요청은 스위프트 2.0 솔루션입니다 :

let txt = "hi my friends!" 
var sentencecaseString = "" 

for (index, character) in txt.characters.enumerate() { 
    if 0 == index { 
     sentencecaseString += String(character).uppercaseString 
    } else { 
     sentencecaseString.append(character) 
    } 
} 

또는 확장으로 :

func sentencecaseString() -> String { 
    var sentencecaseString = "" 
    for (index, character) in self.characters.enumerate() { 
     if 0 == index { 
      sentencecaseString += String(character).uppercaseString 
     } else { 
      sentencecaseString.append(character) 
     } 
    } 
    return sentencecaseString 
} 
관련 문제