我想将字符串转换为Title案例,但不包括一些不需要更改的字词,作为产品,服务和其他商标名称的名称。
使用此代码:
var storyTtitle = "Presented the new PowerBook"
let newStr = str.capitalizedStringWithLocale(NSLocale.currentLocale())
这里的结果是:“提出新的Powerbook”,不幸的是改变了“Powerbook”这个词,在这种情况下,这是一个错误。有没有人知道是否有办法排除某些单词,可能包含在列表中?
答案 0 :(得分:2)
我希望这会有所帮助。有一些不同的函数可用于大写字符串。我想这就是你想要的。
var storyTtitle: String = "Presented the new PowerBook"
var newStr: String = ""
var listToExclude: [String] = ["PowerBook"]
var stringArray: [String] = storyTtitle.componentsSeparatedByString(" ")
for str in stringArray {
for excludeStr in listToExclude {
if !str.containsString(excludeStr) {
newStr.appendContentsOf(str.localizedCapitalizedString)
if str != stringArray.last {
newStr.appendContentsOf(" ")
}
}
}
}
print(newStr)
答案 1 :(得分:2)
您可以enumerateSubstringsInRange()
使用.ByWords
用于枚举字符串中所有单词的选项。这具有优势
即使单词没有分隔,它也能正常工作
空间人物。
您的想法来自上述评论
已经包含大写字母的单词(例如iPhone,OS X,Xcode,MacBook,iOS)不会更改,而所有不包含任何大写字母的单词都可能会发生变化
然后可以像这样实现:
let storyTtitle = "Presented 'the' new PowerBook! (or iPhone?)"
var newTitle = storyTtitle
var offset = 0
storyTtitle.enumerateSubstringsInRange(storyTtitle.characters.indices, options: .ByWords) {
(substring, substringRange, _, _) in
if let oldString = substring where oldString == oldString.lowercaseString {
let range = substringRange.startIndex.advancedBy(offset) ..< substringRange.endIndex.advancedBy(offset)
let newString = oldString.capitalizedString
newTitle.replaceRange(range, with: newString)
offset += newString.characters.count - oldString.characters.count
}
}
print(newTitle)
// Presented 'The' New PowerBook! (Or iPhone?)
offset
变量和“复杂”范围计算
必要的,因为字符串的大写版本没有
必须与小写版本具有相同数量的字符。
例如,在德语中,"ß"
的大写字符串为"SS"
。