Last updated
let numbers: [Character] = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
let symbles: [Character] = ["-", "+"]
let space: Character = " "
func strToInt(_ str: String) -> Int {
let chrs = Array(str)
var res: String = ""
var lastChr: Character?
for idx in 0..<chrs.count {
let c = chrs[idx]
guard
symbles.contains(c) || numbers.contains(c) || space == c
else {
return number(of: res)
}
if let last = lastChr {
// 空格之后只能跟 空格 符号 数字
if last == space {
lastChr = c
if symbles.contains(c) || numbers.contains(c) {
res.append(c)
}
}
// 符号后只能跟数字
else if symbles.contains(last), numbers.contains(c) {
lastChr = c
res.append(c)
}
// 数字后只能跟数字
else if numbers.contains(last), numbers.contains(c) {
lastChr = c
res.append(c)
}
else {
return number(of: res)
}
}
else {
if numbers.contains(c) {
res.append(c)
}
else if symbles.contains(c) {
res.append(c)
}
lastChr = c
}
}
return number(of: res)
}
func number(of str: String) -> Int {
guard str.isEmpty == false, let last = str.last, symbles.contains(last) == false else {
return 0
}
let maxValue = NSDecimalNumber(decimal: pow(2, 31)).intValue - 1
let minValue = -NSDecimalNumber(decimal: pow(2, 31)).intValue
if let res = Int64(str) {
if res > Int64(maxValue) { return maxValue }
if res < Int64(minValue) { return minValue }
return Int(res)
}
return str.contains("-") ? minValue : maxValue
}