您所需要做的就是以相反的方式遍历罗马字符串字符并映射这些字符值。从maxValue等于零开始,切换字母值,将其保存为maxValue,如果该值等于maxValue,则加上它,否则减去实际值。您还可以使用正则表达式(无论是否严格)进行验证,并在失败时抛出错误。尝试这样:
Xcode 9.x•Swift 4.x
注意:对于Swift 3版本或更早的版本,请检查编辑历史记录。
extension String {
enum RomanParsingError: Error {
case invalidNumber
}
func romanNumeralValue() throws -> Int {
guard range(of: "^(?=[MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$", options: .regularExpression) != nil else {
throw RomanParsingError.invalidNumber
}
var result = 0
var maxValue = 0
uppercased().reversed().forEach {
let value: Int
switch $0 {
case "M":
value = 1000
case "D":
value = 500
case "C":
value = 100
case "L":
value = 50
case "X":
value = 10
case "V":
value = 5
case "I":
value = 1
default:
value = 0
}
maxValue = max(value, maxValue)
result += value == maxValue ? value : -value
}
return result
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
do {
let decimal = try "MCMLXXVIII".romanNumeralValue()
print(decimal) // 1978
} catch {
print(error)
}
do {
let decimal = try "IIIV".romanNumeralValue()
print(decimal)
} catch {
print(error) // "invalidNumber\n"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
843 次 |
| 最近记录: |