我希望在swift中使用NSNumber并将其转换为Roman Numeral字符串。有什么想法吗?
答案 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
}