【发布时间】:2014-06-18 10:09:55
【问题描述】:
德国税号 (Steueridentifikationsnummer) 具有以下属性:
- 有 11 位数字
- 第一位不能为0
- 在前十位数字中:一个数字恰好出现两次或三次,一位或两位数字出现零次,其他数字恰好出现一次
- 最后一位是校验和Example Code for Checksum
第三个要点对我来说有点难以优雅地解决。我已经有了其他三个要点的代码,但很想得到最后一个要点的输入,以便其他人可以参考一下。
# validate tax number
$taxNumber = $_POST['taxNumber'];
echo preg_replace("/[^0-9]/", "", $taxNumber);
if (strlen($taxNumber != 11)) {
# 11 digits
$taxNumberValid = false;
} else if ($taxNumber[0] == "0") {
# first digit != 0
$taxNumberValid = false;
} else {
# one digit two times, one digit zero times
# checksum
$numbers = str_split($taxNumber);
$sum = 0;
$product = 10;
for ($i = 0; $i <= 9; $i++) {
$sum = ($numbers[$i] + $product) % 10;
if ($sum == 0) {
$sum = 10;
}
$product = ($sum * 2) % 11;
}
$checksum = 11 - $product;
if ($checksum == 10) {
$checksum = 0;
}
if ($taxNumber[10] != $checksum) {
$taxNumberValid = false;
}
}
【问题讨论】:
-
SO etiquette 会建议您在问题中显示您当前的验证码,如果有人帮助您,不要将其作为奖品提供。
-
@feeela 请看一下你自己的链接,gregexp 只是验证字符串是否由 11 位数字组成,中间用两个破折号分隔,所以在这里根本没有帮助。
-
@user574632 你说得对,我刚刚用我的代码更新了帖子
-
如何将所有 10 位数字添加到数组中,然后使用 array_count_values()?在此之后,只有一个键可能有 2 作为值。
-
@SaschaP 感谢您的输入,非常优雅地解决了它
标签: php validation