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

时间:2016-04-30 00:35:36

标签: ios string swift math

所以我正在构建一个示例项目,该项目采用罗马数字并将其转换为base10数字。我尝试让这个工作,但没有完成我的目标。有谁知道怎么做到这一点?我正在添加下面的10个罗马数字作为参考。谢谢!

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

2 个答案:

答案 0 :(得分:5)

您只需要以相反的方式遍历您的罗马字符串字符并映射这些字符值。从maxValue等于零开始,切换字母值,将其保存为maxValue,如果值等于maxValue,则添加它,否则减去实际值。您也可以使用regex(严格或不严格)验证并在失败时抛出错误。试试这样:

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
    }
}

用法:

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"
}

答案 1 :(得分:1)

罗马数字与十进制数字没有一对一的映射关系。您绘制了从1到9(单个十进制数字)的罗马数字序列。还有10,50,100,500和1000的罗马数字。

如果要将罗马数字中的大数字转换为十进制数,则需要对其进行解析。你需要先处理那些较大的单位。

在纸上绘制出如何自行完成转换的步骤。然后用伪代码写出这些步骤。 (不要担心语法,只需绘制出步骤。)

最后,使用您的伪代码作为编写Swift程序的指南。