代码之家  ›  专栏  ›  技术社区  ›  mjallday

如何验证新加坡鳍?

  •  3
  • mjallday  · 技术社区  · 16 年前

    有人能提供一个算法来验证新加坡的鳍吗?

    我知道,对于新加坡NRIC,我可以通过模块11对其进行验证,然后将结果与查找表进行比较,但找不到与FIN类似的查找表。

    我也不确定模11是否是正确的验证方法。

    我知道政府以400美元的价格出售一种算法,但也许有人知道一种更便宜的方法。

    C实施的奖励积分。

    4 回复  |  直到 10 年前
        1
  •  6
  •   mjallday    15 年前

    还有在PHP中

    function isNricValid ($theNric) {
    
        $multiples = array( 2, 7, 6, 5, 4, 3, 2 );
    
        if (!$theNric || $theNric == '')
        {
            return false;
        }
    
        if (strlen($theNric) != 9)
        {
            return false;
        }
    
        $total = 0;
        $count = 0;
        $numericNric = 0;
    
        $first = $theNric[0];
        $last = $theNric[strlen($theNric) - 1];
    
        if ($first != 'S' && $first != 'T')
        {
            return false;
        }
    
        $numericNric = substr($theNric, 1, strlen($theNric) - 2);
    
        if (!is_numeric ($numericNric)) {
            return false;
        }
    
        while ($numericNric != 0)
        {
            $total += ($numericNric % 10) * $multiples[sizeof($multiples) - (1 + $count++)];
    
            $numericNric /= 10;
            $numericNric = floor($numericNric);
        }
    
        $outputs = '';
        if (strcmp($first, "S") == 0)
        {
            $outputs = array( 'J', 'Z', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A' );
        }
        else
        {   
            $outputs = array( 'G', 'F', 'E', 'D', 'C', 'B', 'A', 'J', 'Z', 'I', 'H' );
        }
    
        return $last == $outputs[$total % 11];
    
    }
    
    function isFinValid ($fin)
    {
        $multiples = array( 2, 7, 6, 5, 4, 3, 2 );
        if (!$fin || $fin == '')
        {
            return false;
        }
    
        if (strlen($fin) != 9)
        {
            return false;
        }
    
        $total = 0;
        $count = 0;
        $numericNric = 0;
        $first = $fin[0];
        $last = $fin[strlen($fin) - 1];
    
        if ($first != 'F' && $first != 'G')
        {
            return false;
        }
    
        $numericNric = substr($fin, 1, strlen($fin) - 2);
    
        if (!is_numeric ($numericNric)) {
            return false;
        }
    
        while ($numericNric != 0)
        {
            $total += ($numericNric % 10) * $multiples[sizeof($multiples) - (1 + $count++)];
    
            $numericNric /= 10;
            $numericNric = floor($numericNric);
        }
    
        $outputs = array();
    
        if (strcmp($first, 'F') == 0)
        {
            $outputs = array( 'X', 'W', 'U', 'T', 'R', 'Q', 'P', 'N', 'M', 'L', 'K' );
        }
        else
        {
            $outputs = array( 'R', 'Q', 'P', 'N', 'M', 'L', 'K', 'X', 'W', 'U', 'T' );
        }
    
        return $last == $outputs[$total % 11];
    }
    
        2
  •  5
  •   mjallday    15 年前

    下面是用javascript编写的类似代码

    var nric = [];
    
    nric.multiples = [ 2, 7, 6, 5, 4, 3, 2 ];
    
    nric.isNricValid = function (theNric) {
    
        if (!theNric || theNric == '')
        {
            return false;
        }
    
        if (theNric.length != 9)
        {
            return false;
        }
    
        var total = 0
            , count = 0
            , numericNric;
        var first = theNric[0]
            , last = theNric[theNric.length - 1];
    
        if (first != 'S' && first != 'T')
        {
            return false;
        }
    
        numericNric = theNric.substr(1, theNric.length - 2);
    
        if (isNaN(numericNric)) {
            return false
        }
    
        while (numericNric != 0)
        {
            total += (numericNric % 10) * nric.multiples[nric.multiples.length - (1 + count++)];
    
            numericNric /= 10;
            numericNric = Math.floor(numericNric);
        }
    
        var outputs;
        if (first == 'S')
        {
            outputs = [ 'J', 'Z', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A' ];
        }
        else
        {
            outputs = [ 'G', 'F', 'E', 'D', 'C', 'B', 'A', 'J', 'Z', 'I', 'H' ];
        }
    
        return last == outputs[total % 11];
    
    }
    
    nric.isFinValid = function(fin)
    {
        if (!fin || fin == '')
        {
            return false;
        }
    
        if (fin.length != 9)
        {
            return false;
        }
    
        var total = 0
            , count = 0
            , numericNric;
        var first = fin[0]
            , last = fin[fin.length - 1];
    
        if (first != 'F' && first != 'G')
        {
            return false;
        }
    
       numericNric = fin.substr(1, fin.length - 2);
    
        if (isNaN(numericNric)) {
            return false;
        }
    
        while (numericNric != 0)
        {
            total += (numericNric % 10) * nric.multiples[nric.multiples.length - (1 + count++)];
    
            numericNric /= 10;
            numericNric = Math.floor(numericNric);
        }
    
        var outputs;
        if (first == 'F')
        {
            outputs = [ 'X', 'W', 'U', 'T', 'R', 'Q', 'P', 'N', 'M', 'L', 'K' ];
        }
        else
        {
            outputs = [ 'R', 'Q', 'P', 'N', 'M', 'L', 'K', 'X', 'W', 'U', 'T' ];
        }
    
        return last == outputs[total % 11];
    }
    
        3
  •  2
  •   mjallday    16 年前

    在四处搜索之后,我找到了一种验证它们的方法。这并不意味着鳍是有效的,只是它在一个有效的范围内。

    我基于算法 http://www.ngiam.net/NRIC/ppframe.htm

    我还包括了一个类似的检查NRIC的方法,因为我认为任何一个遇到这个并且对其中一个感兴趣的人也对另一个感兴趣。

    希望这能帮助别人!

        private static readonly int[] Multiples = { 2, 7, 6, 5, 4, 3, 2 };
    
        public static bool IsNricValid(string nric)
        {
            if (string.IsNullOrEmpty(nric))
            {
                return false;
            }
    
            //  check length
            if (nric.Length != 9)
            {
                return false;
            }
    
            int total = 0
                , count = 0
                , numericNric;
            char first = nric[0]
                , last = nric[nric.Length - 1];
    
            if (first != 'S' && first != 'T')
            {
                return false;
            }
    
            if (!int.TryParse(nric.Substring(1, nric.Length - 2), out numericNric))
            {
                return false;
            }
    
            while (numericNric != 0)
            {
                total += numericNric % 10 * Multiples[Multiples.Length - (1 + count++)];
    
                numericNric /= 10;
            }
    
            char[] outputs;
            if (first == 'S')
            {
                outputs = new char[] { 'J', 'Z', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A' };
            }
            else
            {
                outputs = new char[] { 'G', 'F', 'E', 'D', 'C', 'B', 'A', 'J', 'Z', 'I', 'H' };
            }
    
            return last == outputs[total % 11];
    
        }
    
        public static bool IsFinValid(string fin)
        {
            if (string.IsNullOrEmpty(fin))
            {
                return false;
            }
    
            //  check length
            if (fin.Length != 9)
            {
                return false;
            }
    
            int total = 0
                , count = 0
                , numericNric;
            char first = fin[0]
                , last = fin[fin.Length - 1];
    
            if (first != 'F' && first != 'G')
            {
                return false;
            }
    
            if (!int.TryParse(fin.Substring(1, fin.Length - 2), out numericNric))
            {
                return false;
            }
    
            while (numericNric != 0)
            {
                total += numericNric % 10 * Multiples[Multiples.Length - (1 + count++)];
    
                numericNric /= 10;
            }
    
            char[] outputs;
            if (first == 'F')
            {
                outputs = new char[] { 'X', 'W', 'U', 'T', 'R', 'Q', 'P', 'N', 'M', 'L', 'K' };
            }
            else
            {
                outputs = new char[] { 'R', 'Q', 'P', 'N', 'M', 'L', 'K', 'X', 'W', 'U', 'T' };
            }
    
            return last == outputs[total % 11];
        }
    
        4
  •  -1
  •   BConic    10 年前

    以下是nric&fin algaritham的URL。

    http://www.arjun.com.np/blog/all-about-nric-number-in-singapore/

    public class NRIC_FIN {
    
        public static void main(String[] args) {
    
            String idNumber = "T123d121J";
            String NRIC = idNumber.toUpperCase();
            String number;
            int sum = 0;
            if (NRIC.length() != 9) {
                System.out.println("must be 9 digits..");
                return;
            }
    
            number = NRIC.substring(1, 8);
    
            if (!isNAN(at(number, 0)))
                sum += valueOf(at(number, 0)) * 2;
            if (!isNAN(at(number, 1)))
                sum += valueOf(at(number, 1)) * 7;
            if (!isNAN(at(number, 2)))
                sum += valueOf(at(number, 2)) * 6;
            if (!isNAN(at(number, 3)))
                sum += valueOf(at(number, 3)) * 5;
            if (!isNAN(at(number, 4)))
                sum += valueOf(at(number, 4)) * 4;
            if (!isNAN(at(number, 5)))
                sum += valueOf(at(number, 5)) * 3;
            if (!isNAN(at(number, 6)))
                sum += valueOf(at(number, 6)) * 2;
    
            if (NRIC.charAt(0) == 'T' || NRIC.charAt(0) == 'G') {
                sum += 4;
            }
    
            char checkChar = NRIC.charAt(8);
    
            double p = 11 - (sum % 11);
    
            if (NRIC.charAt(0) == 'S' || NRIC.charAt(0) == 'T') {
    
                if ((p == 1 && checkChar == 'A') || (p == 2 && checkChar == 'B')
                        || (p == 3 && checkChar == 'C')
                        || (p == 4 && checkChar == 'D')
                        || (p == 5 && checkChar == 'E')
                        || (p == 6 && checkChar == 'F')
                        || (p == 7 && checkChar == 'G')
                        || (p == 8 && checkChar == 'H')
                        || (p == 9 && checkChar == 'I')
                        || (p == 10 && checkChar == 'Z')
                        || (p == 11 && checkChar == 'J')) {
                    System.out.println("true...NRIC");
                }
            }
    
            if (NRIC.charAt(0) == 'F' || NRIC.charAt(0) == 'G') {
                if ((p == 1 && checkChar == 'K') || (p == 2 && checkChar == 'M')
                        || (p == 3 && checkChar == 'L')
                        || (p == 4 && checkChar == 'N')
                        || (p == 5 && checkChar == 'P')
                        || (p == 6 && checkChar == 'Q')
                        || (p == 7 && checkChar == 'R')
                        || (p == 8 && checkChar == 'T')
                        || (p == 9 && checkChar == 'U')
                        || (p == 10 && checkChar == 'W')
                        || (p == 11 && checkChar == 'X')) {
                    System.out.println("true ...FIN");
                }
    
            }
            System.out.println("flase ...");
        }
    
        public static boolean isNAN(char c) {
            return !Character.isDigit(c);
        }
    
        public static int valueOf(char c) {
            return (((int) c) - 48);
        }
    
        public static char at(String from, int index) {
            return from.charAt(index);
        }
    }