Swift中的土耳其身份证号码验证

时间:2018-11-30 09:02:19

标签: swift function numeric digits turkish

如何确定给定的文本是土耳其身份证号? 我见过js version herephthon version here

土耳其语身份验证不仅仅检查其数字,它还具有其他功能。 让我更清楚一点,它是数字,有11位数字。例如,假设前9位数字用d表示,后一位数字用c:

表示。
Identity Number = d1 d2 d3 d4 d5 d6 d7 d8 d9 c1 c2

第10个数字必须是

c1 = ( (d1 + d3 + d5 + d7 + d9) * 7 - (d2 + d4 + d6 + d8) ) mod10

必须是11号,

c2 = ( d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + c1 ) mod10

,且永远不会以“ 0”开头 例如,“ 87836910956”是土耳其身份证号码。

3 个答案:

答案 0 :(得分:3)

一个简单的实现:

/srv/pillar/swap.sls

答案 1 :(得分:1)

https://gist.github.com/befy/91dbdb9239fbf726cc1eaeeb5d9d6151  您可以查看我的要点,其他人的要点要短一些。

func validateID(_ id: String) -> Bool {
 let digits = id.map {Int(String($0))} as! [Int]
 guard digits.count == 11, digits[0] != 0, digits[9] != 0 else { return false }
 let firstValidation = (digits[0] + digits[2] + digits[4] + digits[6] + digits[8]) * 7
 let secondValidation = digits[1] + digits[3] + digits[5] + digits[7]

 let tenthDigit = (firstValidation - secondValidation) % 10
 let eleventhDigit = (digits.reduce(0, +) - digits[10]) % 10
 return (digits[9] == tenthDigit && digits[10] == eleventhDigit) ? true: false
}

//usage
validateID("49673861228") //returns true and generated from https://www.simlict.com/

https://medium.com/@ntanyeri/swift-ile-tc-numaras%C4%B1-do%C4%9Frulama-24c7a9827ed 这篇文章可能会对您有所帮助。

public class func validateCitizenshipID(ID: Int) -> Bool {
let digits = ID.description.characters.map { Int(String($0)) ?? 0 }

if digits.count == 11
{
    if (digits.first != 0)
    {
        let first   = (digits[0] + digits[2] + digits[4] + digits[6] + digits[8]) * 7
        let second  = (digits[1] + digits[3] + digits[5] + digits[7])

        let digit10 = (first - second) % 10
        let digit11 = (digits[0] + digits[1] + digits[2] + digits[3] + digits[4] + digits[5] + digits[6] + digits[7] + digits[8] + digits[9]) % 10

        if (digits[10] == digit11) && (digits[9] == digit10)
        {
            return true
        }
    }
}
return false
}

答案 2 :(得分:0)

通过使用guard,您可以摆脱所有这些if的深层嵌套:

func isValidIdentityNumber(_ value: String) -> Bool {
    guard
        value.count == 11,
        let digits = value.map({ Int(String($0)) }) as? [Int],
        digits[0] != 0
    else { return false }

    let check1 = (
        (digits[0] + digits[2] + digits[4] + digits[6] + digits[8]) * 7
        - (digits[1] + digits[3] + digits[5] + digits[7])
    ) % 10

    guard check1 == digits[9] else { return false }

    let check2 = (digits[0...8].reduce(0, +) + check1) % 10

    return check2 == digits[10]
}

请注意,如果value中的任何字符由于Int包含map的结果而不能转换为nil,则第4行的转换将失败。