在 Swift 中将字符转换为 Int
Convert Character to Int in Swift
我正在开展一个项目,其中包括使用 Damm Algorithm 验证 Int 输入的校验和。我已经设法创建了一个可操作的 table 并且我访问 table 中的值的方法涉及传递一个临时值和一个数字作为列值传入。
例如
self.tableToUse[interim,checkSumArray[i]]
不幸的是,当我试图将输入中的数字传递到 get/set 方法时,我 运行 遇到了麻烦,但我找不到将字符转换为整数。
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 Table 中使用字符而不是 Ints 的选项我已经构建并更改了 get/set 方法来处理这些问题,但这是很多额外的工作,可以引入其他问题。对于处理此问题的替代方法或将字符转换为整数的方法的任何建议,我们将不胜感激。
谢谢!
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
edit/update 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
无需使用字符,但您的代码可以创建一个
输入数字的小数位数组可以很大
简化:
var checkSumArray = [Int]()
var tmp = number
while tmp > 0 {
checkSumArray.append(tmp % 10)
tmp /= 10
}
checkSumArray = checkSumArray.reverse()
基于,你可以这样做(数字必须是正数):
let checkSumArray = map(number.description) { String([=10=]).toInt()! }
我正在开展一个项目,其中包括使用 Damm Algorithm 验证 Int 输入的校验和。我已经设法创建了一个可操作的 table 并且我访问 table 中的值的方法涉及传递一个临时值和一个数字作为列值传入。 例如
self.tableToUse[interim,checkSumArray[i]]
不幸的是,当我试图将输入中的数字传递到 get/set 方法时,我 运行 遇到了麻烦,但我找不到将字符转换为整数。
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 Table 中使用字符而不是 Ints 的选项我已经构建并更改了 get/set 方法来处理这些问题,但这是很多额外的工作,可以引入其他问题。对于处理此问题的替代方法或将字符转换为整数的方法的任何建议,我们将不胜感激。
谢谢!
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
edit/update 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
无需使用字符,但您的代码可以创建一个 输入数字的小数位数组可以很大 简化:
var checkSumArray = [Int]()
var tmp = number
while tmp > 0 {
checkSumArray.append(tmp % 10)
tmp /= 10
}
checkSumArray = checkSumArray.reverse()
基于
let checkSumArray = map(number.description) { String([=10=]).toInt()! }