在Swift中将NSNumber转换为罗马数字字符串

时间:2016-03-17 17:49:46

标签: swift nsnumber swift-extensions

我希望在swift中使用NSNumber并将其转换为Roman Numeral字符串。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

最好的办法是编写NSNumber的扩展名(类似于Objective-C类别)。以下代码采用NSNumber并将其转换为罗马数字字符串。您可以将此扩展程序放在项目中的任何位置,但我建议使用Utilities文件或类似的东西。

请注意:对于小于1的数字,此代码将返回“”。虽然这在罗马数字数字方面可能没问题(零不存在),但您可能希望在自己的实现中以不同的方式处理它。

extension NSNumber {
    func romanNumeral() -> String {
        var integerValue = self.integerValue
        var numeralString = ""
        let mappingList: [(Int, String)] = [(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")]
        for i in mappingList {
            while (integerValue >= i.0) {
                integerValue -= i.0
                numeralString.appendContentsOf(i.1)
            }
        }
        return numeralString
    }
}

感谢Kenneth Bruno关于改进代码的一些建议。

答案 1 :(得分:0)

这是我的int到roman转换器的版本(无嵌套循环):

nan

答案 2 :(得分:0)

这是您问题的解决方案,请检查此

func convertRomanToInt(strRoman : String) -> Int {

let arrData = strRoman.map { String($0) }
let dictRomanValue = ["I" : 1, "V" : 5, "X" : 10, "L" : 50, "C" : 100, "D" : 500, "M" : 1000]
var currentValue = 0
var preValue = 0
var ans = 0

for (_,obj) in arrData.enumerated().reversed() {
    _ = dictRomanValue.map({ strName in

        if obj == strName.key {
            currentValue = strName.value
            
            if currentValue < preValue && preValue > 0 {
                ans = ans - preValue + (preValue - currentValue)
                preValue = strName.value
            }else{
                preValue = strName.value
                ans = ans + strName.value
            }
             
        }else{
              ans
        }
    })
}
return ans

}

使用方法:很简单,你要调用这个函数

示例:convertRomanToInt(strRoman: "LVIII")

注意:它仅适用于您的号码 < = 3999。

如果您获得更多数字,请在“dictRomanValue”中添加更大的罗马值。

答案 3 :(得分:0)

这就是使用 for 循环和字典的方法。

func romanToInt(_ s: String) -> Int {
    
    let numDict: [String: Int] = ["I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000]
    
    let stringArray = Array(s)
    
    var result: Int = 0
    
    for index in 0..<stringArray.count {
        for (k, v) in numDict {
            if String(stringArray[index]) == k {
                if (index + 1) < stringArray.count {
                    if k == String(stringArray[index + 1]) {
                        result += v
                    } else {
                        let nextValue = stringArray[index + 1]
                        for (nextK, nextV) in numDict {
                            if String(nextValue) == nextK {
                                if v < nextV {
                                    result -= v
                                } else {
                                    result += v
                                }
                            }
                        }
                    }
                } else {
                    result += v
                }
            }
        }
    }
    return result
}