在Swift中将字符转换成整数

4

我正在进行一个项目,其中需要使用Damm算法验证整数输入的校验和。我已经成功创建了操作表,我的访问表格中值的方法涉及传递一个临时值和要作为列值传递的数字。

     self.tableToUse[interim,checkSumArray[i]]

很不幸,当我尝试将输入的数字传递到获取/设置方法中时,我遇到了一个问题,无法找到将字符转换为整数的方法。

    func encode(number: Int) -> Int{
    var checkSumArray = [Int]()
    if number > 99999999 {
        println("number is too large")
        return 0
    }
    else if number < 0 {
        println("invalid input")
        return 0
    }
    else {
        checkSumArray.append(number%(10))
        checkSumArray.append((number%(100)-checkSumArray[0])/10)
        checkSumArray.append((number%(1000)-checkSumArray[1])/100)
        checkSumArray.append((number%(10000)-checkSumArray[2])/1000)
        checkSumArray.append((number%(100000)-checkSumArray[3])/10000)
        checkSumArray.append((number%(1000000)-checkSumArray[4])/100000)
        checkSumArray.append((number%(10000000)-checkSumArray[5])/1000000)
        checkSumArray.append((number%(100000000)-checkSumArray[6])/10000000)
        checkSumArray = checkSumArray.reverse()

        var interim: Int = 0

        for i in 0..<checkSumArray.count{
            interim = self.tableToUse[interim,checkSumArray[i]]
        }
        return interim
    }
}

正如您所看到的,我不得不采取一种非常恶劣的方式来处理这个问题。它能够工作,但是非常有限、低效,并且很难看或维护。我尝试过使用字符而不是整数在我构建的Damm表中,并修改get/set方法以处理它们,但那需要大量额外的工作,并可能引入其他问题。如果有其他替代方法或将字符转换为整数的方法,将不胜感激。

谢谢!


1
这个问题的标题非常令人困惑。我不得不读几遍才发现你实际上是在寻找“处理这个问题的替代方法的建议”:将一个数字转换为数字数组。 - Krzak
可能是重复的问题:如何在Swift中将*正数*转换为数字数组 - Krzak
你说得对,@Krzak,在阅读了这篇文章之后,另一个标题更有意义。提供的解决方案的结合极大地改善了我的函数。谢谢大家! - beatsbears
3个回答

2

我最终在我编写的其他校验位类中使用了这种方法。非常有帮助! - beatsbears

2
if let int = Int(String(Character("1"))) {
    print(int)
}

您可以按照以下方式创建字符扩展:
extension Character {
    var integerValue: Int? {
        return Int(String(self)) 
    }
}

测试

Character("1").integerValue  // 1
Character("2").integerValue  // 2
Character("3").integerValue  // 3
Character("4").integerValue  // 4
Character("5").integerValue  // 5
Character("6").integerValue  // 6
Character("7").integerValue  // 7
Character("8").integerValue  // 8
Character("9").integerValue  // 9
Character("0").integerValue  // 0
Character("a").integerValue  // nil

Array("9876").first!.integerValue  // 9
Array("9876")[1].integerValue      // 8
Array("9876")[2].integerValue      // 7
Array("9876").last!.integerValue   // 6

编辑/更新 Swift 5

Swift 5为字符(Character)添加了许多新属性,其中一个属性恰好适用于此目的。它被称为wholeNumberValue

Character("1").wholeNumberValue  // 1
Character("2").wholeNumberValue  // 2
Character("3").wholeNumberValue  // 3
Character("4").wholeNumberValue  // 4
Character("④").wholeNumberValue  // 4
Character("5").wholeNumberValue  // 5
Character("6").wholeNumberValue  // 6
Character("7").wholeNumberValue  // 7
Character("8").wholeNumberValue  // 8
Character("9").wholeNumberValue  // 9
Character("0").wholeNumberValue  // 0
Character("万").wholeNumberValue  // 10_000
Character("a").wholeNumberValue  // nil

1

不需要使用字符,但是可以大大简化您的代码来创建一个由输入数字的十进制数字组成的数组:

var checkSumArray = [Int]()
var tmp = number
while tmp > 0 {
    checkSumArray.append(tmp % 10)
    tmp /= 10
}
checkSumArray = checkSumArray.reverse()  

一个解释性的评论对于这个踩票会非常有帮助! - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接