如何获取罗马数字字符串并将其转换为base10数字?

Ste*_*ith -6 string math ios swift

因此,我正在构建一个示例项目,该项目使用罗马数字并将其转换为以10为基数的数字。我试图使它起作用,但没有实现我的目标。有谁知道如何做到这一点?我将罗马数字加到10以下以供参考。谢谢!

1-I 2-II 3-III 4-IV 5-V 6-VI 7-VII 8-VIII 9-IX 10-X

Leo*_*bus 5

您所需要做的就是以相反的方式遍历罗马字符串字符并映射这些字符值。从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)