Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Monday, December 14, 2015

How do I validate an Australian Medicare number?

How do I validate an Australian Medicare number?


I'm developing an online form in which user-entered Medicare numbers will need to be validated.

(My specific problem concerns Australian Medicare numbers, but I'm happy for answers regarding American ones too. This question is about Medicare numbers in general.)

So how should I do it?

(It would be good to have the answer in Javascript or a regex.)

Answer by jonathanconway for How do I validate an Australian Medicare number?


I found a forum discussion on the topic:

http://regexadvice.com/forums/thread/57337.aspx

I'm going to try the one 'Aussie Susan' came up with:

^\d{9}B[ADGHJKLNPQRTWY1-9,]?$  

Answer by Jeffrey Kemp for How do I validate an Australian Medicare number?


My Australian Medicare number is 11 numeric digits and includes no letters or other characters.

It is formatted in groups, and the last digit varies according to the member of my family, e.g.:

  • Me: 5101 20591 8-1
  • My wife: 5101 20591 8-2
  • My first child: 5101 20591 8-3

I've seen medicare numbers formatted without the spaces and the dash, but the meaning is the same, so I'd expect to accept 51012059181 as a valid Medicare number as well.

I've also seen context where the last digit is not required or not supposed to be entered; e.g. 5101205918, I guess where they're only interested in the family as a whole.

Therefore, I think this may be appropriate:

^\d{4}[ ]?\d{5}[ ]?\d{1}[- ]?\d?$  

EDIT

Based on the logic in user2247167's answer, I've used the following PL/SQL function in my Apex application to give a user-friendly warning to the user:

FUNCTION validate_medicare_no (i_medicare_no IN VARCHAR2)    RETURN VARCHAR2 IS    v_digit1 CHAR(1);    v_digit2 CHAR(1);    v_digit3 CHAR(1);    v_digit4 CHAR(1);    v_digit5 CHAR(1);    v_digit6 CHAR(1);    v_digit7 CHAR(1);    v_digit8 CHAR(1);    v_check  CHAR(1);    v_result NUMBER;  BEGIN    IF NOT REGEXP_LIKE(i_medicare_no, '^\d{10}\d?{2}$') THEN      RETURN 'Must be 10-12 digits, no spaces or other characters';    ELSE      v_digit1 := SUBSTR(i_medicare_no, 1, 1);      IF v_digit1 NOT IN ('2','3','4','5','6') THEN        RETURN 'Not a valid Medicare number - please check and re-enter';      ELSE        v_digit2 := SUBSTR(i_medicare_no, 2, 1);        v_digit3 := SUBSTR(i_medicare_no, 3, 1);        v_digit4 := SUBSTR(i_medicare_no, 4, 1);        v_digit5 := SUBSTR(i_medicare_no, 5, 1);        v_digit6 := SUBSTR(i_medicare_no, 6, 1);        v_digit7 := SUBSTR(i_medicare_no, 7, 1);        v_digit8 := SUBSTR(i_medicare_no, 8, 1);        v_check  := SUBSTR(i_medicare_no, 9, 1);        v_result := mod(   to_number(v_digit1)                        + (to_number(v_digit2) * 3)                        + (to_number(v_digit3) * 7)                        + (to_number(v_digit4) * 9)                        +  to_number(v_digit5)                        + (to_number(v_digit6) * 3)                        + (to_number(v_digit7) * 7)                        + (to_number(v_digit8) * 9)                       ,10);        IF TO_NUMBER(v_check) != v_result THEN          RETURN 'Not a valid Medicare number - please check and re-enter';        END IF;      END IF;    END IF;    -- no error    RETURN NULL;  END validate_medicare_no;  

Answer by user2247167 for How do I validate an Australian Medicare number?


The regex supplied by Jeffrey Kemp (March 11) would help to validate the allowed characters, but the check algorithm below should be enough to validate that the number conforms to Medicare's rules.

The Medicare card number comprises:

  • Eight digits;
  • A check digit (one digit); and
  • An issue number (one digit).

Note: the first digit of the Medicare card number should be in the range 2 to 6.

Medicare card number check digit calculation

  1. Calculate the sum of: ((digit 1) + (digit 2 * 3) + (digit 3 * 7) + (digit 4 * 9) + (digit 5) + (digit 6 * 3) + (digit 7 * 7) + (digit 8 * 9))

where digit 1 is the highest place value digit of the Medicare card number and digit 8 is the lowest place value digit of the Medicare card number.

Example: for Medicare card number '2123 45670 1', digit 1 is 2 and digit 8 is 7.

  1. Divide the calculated sum by 10.
  2. The check digit is the remainder.

Example: For Medicare card number 2123 4567.

  1. (2) + (1 * 3) + (2 * 7) + (3 * 9) + (4) + (5 * 3) + (6 * 7) + (7 * 9) = 170
  2. Divide 170 by 10. The remainder is 0.
  3. The check digit for this Medicare number is 0.

Source: "Use of Healthcare Identifiers in Health Software Systems - Software Conformance Requirements, Version 1.4", NEHTA, 3/05/2011

Answer by user2943490 for How do I validate an Australian Medicare number?


Adapted to JavaScript:

var validator = function (input, validateWithIrn) {      if (!input) {          return false;      }        var medicareNumber;      var pattern;      var length;      var matches;      var base;      var checkDigit;      var total;      var multipliers;      var isValid;        pattern = /^(\d{8})(\d)/;      medicareNumber = input.toString().replace(/ /g, '');      length = validateWithIrn ? 11 : 10;        if (medicareNumber.length === length) {          matches = pattern.exec(medicareNumber);          if (matches) {              base = matches[1];              checkDigit = matches[2];              total = 0;              multipliers = [1, 3, 7, 9, 1, 3, 7, 9];                for (var i = 0; i < multipliers.length; i++) {                  total += base[i] * multipliers[i];              }                isValid = (total % 10) === Number(checkDigit);          } else {              isValid = false;          }      } else {          isValid = false;      }        return isValid;  };  

Answer by David Rees for How do I validate an Australian Medicare number?


Added Swift version

class func isMedicareValid(input : String, validateWithIrn : Bool) -> Bool {      let multipliers = [1, 3, 7, 9, 1, 3, 7, 9]        let pattern = "^(\\d{8})(\\d)"      let medicareNumber = input.removeWhitespace()      let length = validateWithIrn ? 11 : 10        if medicareNumber.characters.count != length {return false}        let expression = try! NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)        let matches = expression.matchesInString(medicareNumber, options: NSMatchingOptions.ReportProgress, range: NSMakeRange(0, length))        if (matches.count > 0 && matches[0].numberOfRanges > 2) {          let base = medicareNumber.substringWithRange(medicareNumber.startIndex...medicareNumber.startIndex.advancedBy(matches[0].rangeAtIndex(1).length))          let checkDigitStartIndex = medicareNumber.startIndex.advancedBy(matches[0].rangeAtIndex(2).location )          let checkDigitEndIndex = checkDigitStartIndex.advancedBy(matches[0].rangeAtIndex(2).length)          let checkDigit = medicareNumber.substringWithRange(checkDigitStartIndex..

I use some String extensions as well to simplify some operations.

extension String {    func charAtIndex (index: Int) -> String{      var character = ""      if (index < self.characters.count){          let locationStart = self.startIndex.advancedBy(index)          let locationEnd = self.startIndex.advancedBy(index + 1 )          character = self.substringWithRange(locationStart.. String {      return self.stringByReplacingOccurrencesOfString(string, withString: replacement, options: NSStringCompareOptions.LiteralSearch, range: nil)  }    func removeWhitespace() -> String {      return self.replace(" ", replacement: "")  }  }  

Answer by David Rees for How do I validate an Australian Medicare number?


Added Java Version

public static boolean isMedicareValid(String input, boolean validateWithIRN){      int[] multipliers = new int[]{1, 3, 7, 9, 1, 3, 7, 9};      String pattern = "^(\\d{8})(\\d)";      String medicareNumber = input.replace(" " , "");      int length = validateWithIRN ? 11 : 10;        if (medicareNumber.length() != length) {return false;}        Pattern medicatePattern = Pattern.compile(pattern);      Matcher matcher = medicatePattern.matcher(medicareNumber);        if (matcher.find()){            String base = matcher.group(1);          String checkDigit = matcher.group(2);            int total = 0;          for (int i = 0; i < multipliers.length; i++){              total += base.charAt(i) * multipliers[i];          }            return ((total % 10) == Integer.parseInt(checkDigit));      }        return false;    }  


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 71

0 comments:

Post a Comment

Popular Posts

Powered by Blogger.