如何在Swift中拆分或迭代整数而不转换为字符串
我想知道在Swift中是否有一种方法可以将整型分解为单个数字,而不将其转换为字符串。例如:如何在Swift中拆分或迭代整数而不转换为字符串,swift,Swift,我想知道在Swift中是否有一种方法可以将整型分解为单个数字,而不将其转换为字符串。例如: 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 description属性或字符串插值 我在这个网站上找到了各种各样
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 description属性或字符串插值
我在这个网站上找到了各种各样的文章,但我能找到的所有文章要么以字符串开头,要么最终使用字符串描述属性将Int转换为字符串
谢谢 继续除以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 }
}
(但我可能只是在这里使用循环。我发现在大多数情况下,
序列
太难推理了。)只要继续除以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 }
}
(但我可能只是在这里使用循环。我发现在大多数情况下,序列
太难推理。)一种递归方式
extension Int {
func createDigitArray() -> [Int] {
if self < 10 {
return [self]
} else {
return (self / 10).createDigitArray() + [self % 10]
}
}
}
12345.createDigitArray() //->[1, 2, 3, 4, 5]
extension Int{
func createDigitArray()->[Int]{
如果self<10{
返回[自我]
}否则{
返回(self/10).createDigitArray()+[self%10]
}
}
}
12345.createDigitArray()/->[1,2,3,4,5]
一种递归方式
extension Int {
func createDigitArray() -> [Int] {
if self < 10 {
return [self]
} else {
return (self / 10).createDigitArray() + [self % 10]
}
}
}
12345.createDigitArray() //->[1, 2, 3, 4, 5]
extension Int{
func createDigitArray()->[Int]{
如果self<10{
返回[自我]
}否则{
返回(self/10).createDigitArray()+[self%10]
}
}
}
12345.createDigitArray()/->[1,2,3,4,5]
一个非常简单的方法是使用此功能:
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
)
希望有帮助 一个非常简单的方法是使用此函数:
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
)
希望有帮助 你可能也应该像另一个答案那样解决负数。在您的解决方案中,负数有负数。只需附加
abs(num%10)
而不是num%10
,因为-9992
不是由-9
,-9
,-9
和-2
构成的,而是由-9
构成的(3次)和2
如果digits
函数接受radix
参数(10可能是默认值),则会更好。您可能也应该像其他答案一样解决负数问题。在您的解决方案中,负数有负数。只需附加abs(num%10)
而不是num%10
,因为-9992
不是由-9
,-9
,-9
和-2
构成的,而是由-9
构成的(3次)而2
如果digits
函数接受radix
参数(10可能是默认值),则会更好。不适用于负数,由于它返回的是整数而不是数字…如果self<10&&self>=0,则应将条件更改为,并处理<0不适用于负数的情况下的数字前面的-
,由于它返回的是整数而不是数字……如果self<10&&self>=0
,则应将条件更改为,并在<0的情况下处理数字前面的-