给出从互联网上获取的字符串,例如:
星期四晚上,一场雪的降尘使得中雨(总共10毫米)变得最重。冻融条件(周五早上最高8°C,周三晚上最低-2°C)。主要是强风。使用Swift 3,我希望将温度转换为华氏温度。所以我需要找到其后有°C的数字(包括负数);将它们转换为华氏温度,然后将整数替换回字符串。
我最初尝试使用:components(separatedBy:String)。我确实让它使用这种方法。虽然我认为可能有更好的方法。
func convertStringToFahrenheit (_ message: String) -> String{
var stringBuilder = String()
let stringArray = message.components(separatedBy: "°C")
for subString in stringArray {
if subString != stringArray.last {
if subString.contains("(max "){
let subStringArray = subString.components(separatedBy: "(max ")
stringBuilder.append(subStringArray[0])
stringBuilder.append("(max ")
if var tempInt = Int(subStringArray[1]){
tempInt = convertCelsiusToFahrenheit(tempInt)
stringBuilder.append(String(tempInt))
stringBuilder.append("°F")
}
}
else if subString.contains(", min "){
let subStringArray = subString.components(separatedBy: ", min ")
stringBuilder.append(subStringArray[0])
stringBuilder.append(", min ")
if var tempInt = Int(subStringArray[1]){
tempInt = convertCelsiusToFahrenheit(tempInt)
stringBuilder.append(String(tempInt))
stringBuilder.append("°F")
}
}
}
else {
stringBuilder.append(subString)
}
}
return stringBuilder
}
答案 0 :(得分:1)
正则表达的工作。
模式"(-?\\d+)°C"
搜索
-?
\\d+
°C
该组 - 在括号内 - 捕获度数值。
var string = "A dusting of snow giving way to moderate rain (total 10mm) heaviest on Thu night. Freeze-thaw conditions (max 8°C on Fri morning, min -2°C on Wed night). Mainly strong winds."
let pattern = "(-?\\d+)°C"
do {
let regex = try NSRegularExpression(pattern: pattern)
let matches = regex.matches(in: string, range: NSRange(location: 0, length: string.utf16.count))
for match in matches.reversed() { // reversed() is crucial to preserve the indexes.
let celsius = (string as NSString).substring(with: match.rangeAt(1))
let fahrenheit = Double(celsius)! * 1.8 + 32
let range = match.range
let start = string.index(string.startIndex, offsetBy: range.location)
let end = string.index(start, offsetBy: range.length)
string = string.replacingCharacters(in: start..<end, with: String(format: "%.0f°F", fahrenheit))
}
} catch {
print("Regex Error:", error)
}
print(string)
代码中最复杂的部分是转化NSRange
- &gt; Range<String.Index>