Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 南非身份证号码验证并获取年龄和性别_Javascript_Jquery_Validation - Fatal编程技术网

Javascript 南非身份证号码验证并获取年龄和性别

Javascript 南非身份证号码验证并获取年龄和性别,javascript,jquery,validation,Javascript,Jquery,Validation,我对此进行了研究,但我使用的代码似乎都不起作用。南非身份证号码包含出生日期和性别。我所希望的是,当他们的ID号输入到输入字段中时,最好是在jQuery或javascript中输入这些信息并进行验证 感谢您的帮助 Dawid这是我们公司的验证正则表达式: string IdExpression = @"(?<Year>[0-9][0-9])(?<Month>([0][1-9])|([1][0-2]))(?<Day>([0-2][0-9])|([3][0-1]))

我对此进行了研究,但我使用的代码似乎都不起作用。南非身份证号码包含出生日期和性别。我所希望的是,当他们的ID号输入到输入字段中时,最好是在jQuery或javascript中输入这些信息并进行验证

感谢您的帮助


Dawid

这是我们公司的验证正则表达式:

string IdExpression = @"(?<Year>[0-9][0-9])(?<Month>([0][1-9])|([1][0-2]))(?<Day>([0-2][0-9])|([3][0-1]))(?<Gender>[0-9])(?<Series>[0-9]{3})(?<Citizenship>[0-9])(?<Uniform>[0-9])(?<Control>[0-9])";
string-IdExpression=@“(?[0-9][0-9])(?([0][1-9]))([1][0-2])(?([0-2][0-9])([3][0-1])(?[0-9])([0-9])([0-9])([0-9])(([0-9])”;
就使用正则表达式而言,它非常简单

您可以使用Koenyn的正则表达式验证,不太确定输入的一位数(0-9?)如何表示性别,但根据您提供的和David Russell的,这里有一个未经测试的尝试:

更新1: 在遵循这个思路之后,我更新了我的实现,以包括性别和公民身份测试

更新2: 忘记将月号增量
id\u month+1
包装在日期字符串
fullDate
中,使用Dawid的修复更新解决方案

HTML标记

<div id="error"></div>

<form id="idCheck">
    <p>Enter the ID Number: <input id="idnumber" /> </p>
    <p> <input type="submit" value="Check" /> </p>
</form>

<div id="result"> </div>
function Validate() {
    // first clear any left over error messages
    $('#error p').remove();

    // store the error div, to save typing
    var error = $('#error');

    var idNumber = $('#idnumber').val();


    // assume everything is correct and if it later turns out not to be, just set this to false
    var correct = true;

    //Ref: http://www.sadev.co.za/content/what-south-african-id-number-made
    // SA ID Number have to be 13 digits, so check the length
    if (idNumber.length != 13 || !isNumber(idNumber)) {
        error.append('<p>ID number does not appear to be authentic - input not a valid number</p>');
        correct = false;
    }

    // get first 6 digits as a valid date
    var tempDate = new Date(idNumber.substring(0, 2), idNumber.substring(2, 4) - 1, idNumber.substring(4, 6));

    var id_date = tempDate.getDate();
    var id_month = tempDate.getMonth();
    var id_year = tempDate.getFullYear();

    var fullDate = id_date + "-" + (id_month + 1) + "-" + id_year;

    if (!((tempDate.getYear() == idNumber.substring(0, 2)) && (id_month == idNumber.substring(2, 4) - 1) && (id_date == idNumber.substring(4, 6)))) {
        error.append('<p>ID number does not appear to be authentic - date part not valid</p>');
        correct = false;
    }

    // get the gender
    var genderCode = idNumber.substring(6, 10);
    var gender = parseInt(genderCode) < 5000 ? "Female" : "Male";

    // get country ID for citzenship
    var citzenship = parseInt(idNumber.substring(10, 11)) == 0 ? "Yes" : "No";

    // apply Luhn formula for check-digits
    var tempTotal = 0;
    var checkSum = 0;
    var multiplier = 1;
    for (var i = 0; i < 13; ++i) {
        tempTotal = parseInt(idNumber.charAt(i)) * multiplier;
        if (tempTotal > 9) {
            tempTotal = parseInt(tempTotal.toString().charAt(0)) + parseInt(tempTotal.toString().charAt(1));
        }
        checkSum = checkSum + tempTotal;
        multiplier = (multiplier % 2 == 0) ? 1 : 2;
    }
    if ((checkSum % 10) != 0) {
        error.append('<p>ID number does not appear to be authentic - check digit is not valid</p>');
        correct = false;
    };


    // if no error found, hide the error message
    if (correct) {
        error.css('display', 'none');

        // clear the result div
        $('#result').empty();
        // and put together a result message
        $('#result').append('<p>South African ID Number:   ' + idNumber + '</p><p>Birth Date:   ' + fullDate + '</p><p>Gender:  ' + gender + '</p><p>SA Citizen:  ' + citzenship + '</p>');
    }
    // otherwise, show the error
    else {
        error.css('display', 'block');
    }

    return false;
}

function isNumber(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

$('#idCheck').submit(Validate);

输入ID号:

Javascript

<div id="error"></div>

<form id="idCheck">
    <p>Enter the ID Number: <input id="idnumber" /> </p>
    <p> <input type="submit" value="Check" /> </p>
</form>

<div id="result"> </div>
function Validate() {
    // first clear any left over error messages
    $('#error p').remove();

    // store the error div, to save typing
    var error = $('#error');

    var idNumber = $('#idnumber').val();


    // assume everything is correct and if it later turns out not to be, just set this to false
    var correct = true;

    //Ref: http://www.sadev.co.za/content/what-south-african-id-number-made
    // SA ID Number have to be 13 digits, so check the length
    if (idNumber.length != 13 || !isNumber(idNumber)) {
        error.append('<p>ID number does not appear to be authentic - input not a valid number</p>');
        correct = false;
    }

    // get first 6 digits as a valid date
    var tempDate = new Date(idNumber.substring(0, 2), idNumber.substring(2, 4) - 1, idNumber.substring(4, 6));

    var id_date = tempDate.getDate();
    var id_month = tempDate.getMonth();
    var id_year = tempDate.getFullYear();

    var fullDate = id_date + "-" + (id_month + 1) + "-" + id_year;

    if (!((tempDate.getYear() == idNumber.substring(0, 2)) && (id_month == idNumber.substring(2, 4) - 1) && (id_date == idNumber.substring(4, 6)))) {
        error.append('<p>ID number does not appear to be authentic - date part not valid</p>');
        correct = false;
    }

    // get the gender
    var genderCode = idNumber.substring(6, 10);
    var gender = parseInt(genderCode) < 5000 ? "Female" : "Male";

    // get country ID for citzenship
    var citzenship = parseInt(idNumber.substring(10, 11)) == 0 ? "Yes" : "No";

    // apply Luhn formula for check-digits
    var tempTotal = 0;
    var checkSum = 0;
    var multiplier = 1;
    for (var i = 0; i < 13; ++i) {
        tempTotal = parseInt(idNumber.charAt(i)) * multiplier;
        if (tempTotal > 9) {
            tempTotal = parseInt(tempTotal.toString().charAt(0)) + parseInt(tempTotal.toString().charAt(1));
        }
        checkSum = checkSum + tempTotal;
        multiplier = (multiplier % 2 == 0) ? 1 : 2;
    }
    if ((checkSum % 10) != 0) {
        error.append('<p>ID number does not appear to be authentic - check digit is not valid</p>');
        correct = false;
    };


    // if no error found, hide the error message
    if (correct) {
        error.css('display', 'none');

        // clear the result div
        $('#result').empty();
        // and put together a result message
        $('#result').append('<p>South African ID Number:   ' + idNumber + '</p><p>Birth Date:   ' + fullDate + '</p><p>Gender:  ' + gender + '</p><p>SA Citizen:  ' + citzenship + '</p>');
    }
    // otherwise, show the error
    else {
        error.css('display', 'block');
    }

    return false;
}

function isNumber(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

$('#idCheck').submit(Validate);
函数验证(){
//首先清除所有遗留的错误消息
$('#错误p')。删除();
//存储错误div,以保存键入
var error=$(“#error”);
var idNumber=$('#idNumber').val();
//假设一切都是正确的,如果后来发现不正确,只需将其设置为false
var correct=true;
//参考:http://www.sadev.co.za/content/what-south-african-id-number-made
//SA ID编号必须为13位,因此请检查长度
if(idNumber.length!=13 | |!isNumber(idNumber)){
错误。追加(“ID号似乎不真实-输入的数字无效”

); 正确=错误; } //获取前6位数字作为有效日期 var tempDate=新日期(idNumber.substring(0,2),idNumber.substring(2,4)-1,idNumber.substring(4,6)); var id_date=tempDate.getDate(); var id_month=tempDate.getMonth(); var id_year=tempDate.getFullYear(); var fullDate=id_日期+“-”+(id_月+1)+“-”+id年; 如果(!((tempDate.getYear()==idNumber.substring(0,2))&&(id\u month==idNumber.substring(2,4)-1)&&(id\u date==idNumber.substring(4,6))){ 错误。追加(“ID号似乎不真实-日期部分无效”

”; 正确=错误; } //了解性别 var genderCode=idNumber.substring(6,10); var gender=parseInt(genderCode)<5000?“女性”:“男性”; //获取Citizenship的国家ID var citzenship=parseInt(idNumber.substring(10,11))==0?“是”:“否”; //对校验数字应用Luhn公式 总风险=0; var校验和=0; var乘数=1; 对于(变量i=0;i<13;++i){ 试探总=parseInt(idNumber.charAt(i))*乘数; 如果(总数>9){ testotal=parseInt(testotal.toString().charAt(0))+parseInt(testotal.toString().charAt(1)); } 校验和=校验和+总次数; 乘数=(乘数%2==0)?1:2; } 如果((校验和%10)!=0){ 错误。追加(“ID号似乎不真实-检查数字无效”

”; 正确=错误; }; //如果未发现错误,请隐藏错误消息 如果(正确){ css('display','none'); //清除结果div $(“#结果”).empty(); //并将结果消息放在一起 $(“#结果”)。追加(“南非身份证号码:“+idNumber+”

出生日期:“+fullDate+”

性别:“+Gender+”

南非公民:“+citzenship+”

); } //否则,显示错误 否则{ css('display','block'); } 返回false; } 函数isNumber(n){ return!isNaN(parseFloat(n))和&isFinite(n); } $('#idCheck')。提交(验证);

演示

有一个jQuery插件可以使用。在

上查看,或者我们应该是南非人,知道这一点,或者花一些时间做研究。。。你提供更多的信息对我们大家来说不是更容易吗?帮助我们帮助你对不起对不起,非常真实。。。下面是我尝试过的其他一些尝试,我现在找不到,但是。。。它基本上需要检查您是否有13个号码,然后使用“”进行验证。您能否至少提供示例用户输入,即有效的SA ID号码?所以…年、月、日的两位数,然后是性别的一位数(0-9?)(这是怎么回事?),系列的三位数(上下文中的“系列”是什么?)。我不确定其他人的情况。我正是这么想的--->谢谢,@Koenyn,你的回答帮助了我,但是,我注意到你的正则表达式允许出生日为00。我稍微更新了正则表达式的部分:(?([0][1-9])|([1-2][0-9])|([3][0-1])非常欢迎您!如果我有机会在这个Hey Man中通过@st boost实现优雅的校验位代码,我会发现一个小问题。。。它返回的月份。。它似乎从月份中减去一,然后再尝试将其相加,不幸的是,它没有得到7+1=8,而是得到了7+1=71。。我仍然在玩它,但嘿,任何帮助都会很棒。抱歉,修复了-var fullDate=id\u date+“-”+(id\u month+1)+“-”+id\u year;啊,为此干杯。忘记将月数增量包装在日期字符串中,就像您修复的那样。将使用您的修复程序更新我的解决方案,谢谢。我正在使用您的代码,但在添加id号010101时遇到问题。。。。它给出的是1901年而不是2001年的出生年份,对此有什么改进吗?