在Swift中将整数转换为罗马数字字符串
我希望在Swift中获取一个在Swift中将整数转换为罗马数字字符串,swift,nsnumber,swift-extensions,Swift,Nsnumber,Swift Extensions,我希望在Swift中获取一个整数,并将其转换为罗马数字字符串。有什么想法吗?可以在Int上编写一个扩展,类似于下面看到的扩展 请注意:对于小于1的数字,此代码将返回“”。虽然这对于罗马数字(零不存在)来说可能没问题,但您可能希望在自己的实现中以不同的方式处理这个问题 extension Int { var romanNumeral: String { var integerValue = self var numeralString = ""
整数
,并将其转换为罗马数字字符串
。有什么想法吗?可以在Int
上编写一个扩展,类似于下面看到的扩展
请注意:对于小于1的数字,此代码将返回“”。虽然这对于罗马数字(零不存在)来说可能没问题,但您可能希望在自己的实现中以不同的方式处理这个问题
extension Int {
var romanNumeral: String {
var integerValue = self
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 += i.1
}
}
return numeralString
}
}
感谢Kenneth Bruno对改进代码的一些建议。这是我的int-to-roman转换器版本(没有嵌套循环):
我可以得到一些关于为什么这个问题被否决的评论吗?你可以通过在mappingList中将第6行和第7行更改为
来简化代码,其中(integerValue>=I.0){
和所有mappingList[I]
到i
。我还想把它作为一个计算属性,这很适合。对我来说似乎是一个好算法!谢谢你的建议,@KennethBruno。我更新了代码以使用修改后的for循环声明。另外,我是swift新手,所以当我有机会进一步查看映射列表的计算属性时。到将第2行的计算属性更改为var RomanNumeric:String{ <代码> >。你可以称之为代码>数字。浪漫数字< /代码>,就像一个常规属性。哦,去掉第7行和第10行,你不再需要它们了。好,很好知道,谢谢。我当然会考虑。但是我认为while循环仍然是必要的,因为你可以有同一个字母的多个实例。例如,3 =“III”。是的,你说得对,它一定在里面。我完全错过了!
extension Int {
func toRoman() -> String {
let conversionTable: [(intNumber: Int, romanNumber: 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")]
var roman = ""
var remainder = 0
for entry in conversionTable {
let quotient = (self - remainder) / entry.intNumber
remainder += quotient * entry.intNumber
roman += String(repeating: entry.romanNumber, count: quotient)
}
return roman
}
}