我想知道Swift是否有办法将Int分成其个别数字而不用将其转换为String。例如:
let x: Int = 12345
//Some way to loop/iterate over x's digits
//Then map each digit in x to it's String value
//Return "12345"
对于一些背景知识,我正在尝试创建自己的将Int转换为String的方法,而不使用String description属性或使用String Interpolation。
我在这个网站上发现了各种各样的文章,但是我能找到的所有文章都是以String开头,或者最后使用String描述属性将Int转换为String。
感谢。
答案 0 :(得分:3)
继续除以10并取余数:
extension Int {
func digits() -> [Int] {
var digits: [Int] = []
var num = self
repeat {
digits.append(num % 10)
num /= 10
} while num != 0
return digits.reversed()
}
}
x.digits() // [1,2,3,4,5]
请注意,如果值为负,这将返回所有负数。如果要以不同方式处理,可以添加特殊情况。这返回[0]
为0,这可能是你想要的。
因为每个人都喜欢纯函数式编程,所以你也可以这样做:
func digits() -> [Int] {
let partials = sequence(first: self) {
let p = $0 / 10
guard p != 0 else { return nil }
return p
}
return partials.reversed().map { $0 % 10 }
}
(但我可能只是在这里使用循环。在大多数情况下,我发现sequence
太难理解了。)
答案 1 :(得分:1)
递归方式......
extension Int {
func createDigitArray() -> [Int] {
if self < 10 {
return [self]
} else {
return (self / 10).createDigitArray() + [self % 10]
}
}
}
12345.createDigitArray() //->[1, 2, 3, 4, 5]
答案 2 :(得分:0)
一种非常简单的方法是使用此功能:
func getDigits(of number: Int) -> [Int] {
var digits = [Int]()
var x = number
repeat{
digits.insert(abs(x % 10), at: 0)
x/=10
} while x != 0
return digits
}
并像这样使用它:
getDigits(of: 97531) // [9,7,5,3,1]
getDigits(of: -97531) // [9,7,5,3,1]
正如您所看到的,对于负数,您将收到其数字的数组,但是它们的绝对值(例如:-9 => 9
和-99982 => 99982
)
希望它有所帮助!