2012-04-16 35 views
0

NSStringで組み込みのconvertStringToTitleCaseメソッドを使用して開始する次のメソッドを作成しましたが、実際には各単語の最初の文字を大文字にします。 .NETにはTextInfo.ToTitleCaseのメソッドがあり、これはObjective-Cで何をしたいのかを試みるだけでなく、あまりにも短くなります。Objective-Cの大文字の文字列をタイトルケースに変換

http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

私が開始するには書いた方法は以下の通りです。大文字の文字列を正しく扱うにはどうすればよいですか?すべての大文字/小文字のヘルプに変換する単語のデータベースはありますか?コメントで述べたように

- (NSString *)convertStringToTitleCase:(NSString *)str { 
    NSMutableString *convertedStr = [NSMutableString stringWithString:[str capitalizedString]]; 

    NSRange range = NSMakeRange(0, convertedStr.length); 

    // a list of words to always make lowercase could be placed here 
    [convertedStr replaceOccurrencesOfString:@" De " 
            withString:@" de " 
            options:NSLiteralSearch 
             range:range]; 

    // a list of words to always make uppercase could be placed here 
    [convertedStr replaceOccurrencesOfString:@" Tv " 
            withString:@" TV " 
            options:NSLiteralSearch 
             range:range]; 

    return convertedStr; 
} 
+1

http://stackoverflow.com/questions/1778227/string-manipulation-in- objective-cこれはあなたを助けるかもしれません – Habib

+1

.NETメソッドには例外テーブルもありません。そのドキュメントをお読みください。 – Dani

+0

http://www.vengefulcow.com/titlecase/ NSStringのカテゴリの形式で非常に素晴らしいソリューションのように見えます。 – trudyscousin

答えて

6

、あなたが「正しい」のタイトルのケースをしないを参照してください.NETメソッドは(つまり、すべて大文字またはすべて小文字のいずれかに残される例外単語のリストをたどります)ので、-[NSString capitalizedString]はあなたと同じです。例外単語が必要な場合は、独自のメソッドを書く必要があります(または、他の人が見つかった場合はgoogle search for NSString "title case"かもしれません)。

タイトルケーシングがどのように「適切」になるかは、あなたがそれに投げることを喜んでいるいくつの例外単語に依存します。どのくらい英語の言語をサポートしたいですか?他の言語はどうですか?また、単語の境界を分析するにはどれくらいの距離があるかによって異なります。引用符で囲まれているかどうか、文の終わりなどにかかわらず、「テレビ」はすべて大文字にしておきたいかもしれませんが、あなたが「あなたが」「あなたに来た」ことを欲しがっていません。

例外単語を処理したい場合は、replaceOccurrencesOfString...を繰り返し実行する計画では、例外単語が多くなるほど処理速度が遅くなります。 (検索スペース内のスペースを使用すると、他の単語の境界を考慮していないことを意味します)

NSRegularExpressionは、正規表現には大文字と小文字の区別がありません境界。それがうまく動作しない場合、変換された出力文字列を生成しながら入力文字列を読み取るためにスキャナを使用すると、複数の検索/置換操作を実行するより効率的です。

4

素敵なワンライナー(巨大な文字列で、おそらく非常に非効率的ではない一般的な解決策、):

[[str lowercaseString] capitalizedString]; 
0
extension String { 

    /** 
     Get the title case string. 
    */ 
    var titleCase: String { 
     get { 
      return getTitleCaseString() 
     } 
    } 

    // MARK: Private methods. 

    /** 
    Get title case string. 

    - returns: The title case string regarding the lowercase words. 
    */ 
    private func getTitleCaseString() -> String { 
     struct Holder { 
      static let lowercaseWords = ["a", "an", "and", "at", "but", "by", "else", "for", 
             "from", "if", "in", "into", "is", "nor", "of", "off", 
             "on", "or", "out", "the", "to", "via", "vs", "with"] 
     } 
     return replaceToLowercaseAllOccurrencesOfWords(Holder.lowercaseWords).capitalizeFirst 
    } 

    /** 
    Replace to lowercase all occurrences of lowercase words. 

    - parameter lowercaseWords: The lowercase words to replace. 

    - returns: String with all occurrences replace to the lowercase words. 
    */ 
    private func replaceToLowercaseAllOccurrencesOfWords(lowercaseWords: [String]) -> String { 
     let capitalizedSelf = NSMutableString(string: self.capitalizedString) 
     for word in lowercaseWords { 
      if let lowercaseWordRegex = try? NSRegularExpression(pattern: "\\b\(word)\\b", options: .CaseInsensitive) { 
       lowercaseWordRegex.replaceMatchesInString(capitalizedSelf, 
                  options: NSMatchingOptions(), 
                  range: NSMakeRange(0, capitalizedSelf.length), 
                  withTemplate: word) 
      } 
     } 
     return capitalizedSelf as String 
    } 

/** 
    Capitalize first char. 
    */ 
    private var capitalizeFirst: String { 
     if isEmpty { return "" } 
     var result = self 
     result.replaceRange(startIndex...startIndex, with: String(self[startIndex]).uppercaseString) 
     return result 
    } 

}