Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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_Validation_Numbers - Fatal编程技术网

Javascript 如何验证澳大利亚医疗保险号码?

Javascript 如何验证澳大利亚医疗保险号码?,javascript,validation,numbers,Javascript,Validation,Numbers,我正在开发一个在线表单,用户输入的医疗保险号码需要验证 (我的具体问题与澳大利亚的医疗保险数字有关,但我也很高兴得到关于美国医疗保险数字的答案。这个问题与一般的医疗保险数字有关。) 那我该怎么做呢 (最好有Javascript或正则表达式的答案。)我的澳大利亚医疗保险号码是11位数字,不包含字母或其他字符 它按组进行格式化,最后一位数字根据我的家庭成员而有所不同,例如: Me:5101205918-1 我妻子:5101205918-2 我的第一个孩子:5101205918-3 我见过没有空格

我正在开发一个在线表单,用户输入的医疗保险号码需要验证

(我的具体问题与澳大利亚的医疗保险数字有关,但我也很高兴得到关于美国医疗保险数字的答案。这个问题与一般的医疗保险数字有关。)

那我该怎么做呢


(最好有Javascript或正则表达式的答案。)

我的澳大利亚医疗保险号码是11位数字,不包含字母或其他字符

它按组进行格式化,最后一位数字根据我的家庭成员而有所不同,例如:

  • Me:
    5101205918-1
  • 我妻子:
    5101205918-2
  • 我的第一个孩子:
    5101205918-3
我见过没有空格和破折号的医疗保险号码格式,但含义是相同的,因此我希望接受
51012059181
作为有效的医疗保险号码

我还看到了最后一个数字不需要或不应该输入的上下文;e、 g.
5101205918
,我猜他们只对整个家庭感兴趣

因此,我认为这可能是适当的:

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

根据user2247167回答中的逻辑,我在Apex应用程序中使用了以下PL/SQL函数向用户发出用户友好的警告:

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;

Jeffrey Kemp(3月11日)提供的正则表达式有助于验证允许的字符,但下面的检查算法应足以验证数字是否符合医疗保险规则

医疗保险卡号包括:

  • 八位数字
  • 一个校验位(一位);及
  • 发行编号(一位数字)
注意:医疗保险卡号的第一位数字应在2到6之间

医疗保险卡号校验位计算

  • 计算以下各项之和:((数字1)+(数字2*3)+(数字3*7)+(数字4*9)+(数字5)+(数字6*3)+(数字7*7)+(数字8*9))
  • 其中,数字1是医疗保险卡号的最高位值数字,数字8是医疗保险卡号的最低位值数字

    示例:对于医疗保险卡号“2123 45670 1”,数字1是2,数字8是7

  • 将计算出的总和除以10
  • 校验位是余数
  • 示例:用于医疗保险卡号2123 4567

  • (2) +(1*3)+(2*7)+(3*9)+(4)+(5*3)+(6*7)+(7*9)=170
  • 170除以10。余数是0
  • 此医疗保险号码的校验位为0

  • 资料来源:“医疗保健软件系统中医疗保健标识符的使用-软件一致性要求,1.4版”,NEHTA,2011年5月3日

    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;
    };
    
    var validator=函数(输入,validateWithIrn){
    如果(!输入){
    返回false;
    }
    重新编号;
    var模式;
    变异长度;
    var匹配;
    var基;
    var校验位;
    总风险价值;
    var乘数;
    var是有效的;
    模式=/^(\d{8})(\d)/;
    medicareNumber=input.toString().replace(//g',);
    长度=N?11:10;
    if(medicareNumber.length==长度){
    matches=pattern.exec(medicareNumber);
    如果(匹配){
    base=matches[1];
    checkDigit=匹配项[2];
    总数=0;
    乘数=[1,3,7,9,1,3,7,9];
    对于(var i=0;i
    添加了Swift版本

    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..<checkDigitEndIndex)
            var total = 0
    
            for i in 0..<multipliers.count {
                total += Int(base.charAtIndex(i))! * multipliers[i]
            }
    
             return (total % 10) == Int(checkDigit)
        }
        return false
    }
    
    类函数isMedicareValid(输入:字符串,validateWithIrn:Bool)->Bool{
    设乘数=[1,3,7,9,1,3,7,9]
    let pattern=“^(\\d{8})(\\d)”
    让medicareNumber=input.removeWhitespace()
    设长度=N?11:10
    如果medicareNumber.characters.count!=长度{return false}
    let expression=try!NSRegularExpression(模式:模式,选项:NSRegularExpressionOptions.case不区分大小写)
    让matches=expression.matcheInstalling(medicareNumber,选项:NSMatchingOptions.ReportProgress,范围:NSMakeRange(0,长度))
    如果(matches.count>0&&matches[0].numberOfRanges>2){
    让base=medicareNumber.substringWithRange(medicareNumber.startIndex…medicareNumber.startIndex.advancedBy(匹配[0].rangeAtIndex(1).length))
    让checkDigitStartIndex=medicareNumber.startIndex.advancedBy(匹配[0]。RangeAtinex(2)。位置)
    让CheckDigitIndex=checkDigitStartIndex.advancedBy(匹配[0].rangeAtIndex(2).length)
    让checkDigit=medicareNumber.substringWithRange(checkDigitStartIndex..String{
    返回self.replace(“,replacement:”)
    }
    }
    
    添加了Java版本

    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;
    
    }
    
    公共静态布尔isMedicareValid(字符串输入,布尔验证){
    int[]乘数=新的int[]{1,3,7,9,1,3,7,9};
    字符串模式=“^(\\d{8})(\\d)”;
    字符串medicarenNumber=input.replace(“,”);
    整数长度=整数?11:10;
    if(medicareNumber.length()!=length){return false;}
    Pattern medicatePattern=Pattern.compile(Pattern);
    Matcher Matcher=MedicaPattern.Matcher(medicareNumber);
    if(matcher.find()){
    String base=matcher.group(1);
    字符串校验位=matcher.group(2);
    int-total=0;
    对于(int i=0;i
    如果您正在寻找C版本,请尝试一下:

    using System.Linq;
    
    //...
    
    public bool IsMedicareFormatValid(string medicareNumber)
    {
        if (!(medicareNumber?.Length >= 10 && medicareNumber.Length <12) || !medicareNumber.All(char.IsDigit))
            return false;
    
        var digits = medicareNumber.Select(c => (int) char.GetNumericValue(c)).ToArray();
        return digits[8] == GetMedicareChecksum(digits.Take(8).ToArray());
    }
    
    private int GetMedicareChecksum(int[] digits)
    {
        return digits.Zip(new[] { 1, 3, 7, 9, 1, 3, 7, 9 }, (m, d) => m*d).Sum() % 10;
    }
    
    使用System.Linq;
    //...
    公共bool IsMedicareFormatValid(字符串medicareNumber)
    {
    如果我
    
    using System.Linq;
    
    //...
    
    public bool IsMedicareFormatValid(string medicareNumber)
    {
        if (!(medicareNumber?.Length >= 10 && medicareNumber.Length <12) || !medicareNumber.All(char.IsDigit))
            return false;
    
        var digits = medicareNumber.Select(c => (int) char.GetNumericValue(c)).ToArray();
        return digits[8] == GetMedicareChecksum(digits.Take(8).ToArray());
    }
    
    private int GetMedicareChecksum(int[] digits)
    {
        return digits.Zip(new[] { 1, 3, 7, 9, 1, 3, 7, 9 }, (m, d) => m*d).Sum() % 10;
    }
    
    [AustralianMedicareNumberOnly]
    public string MedicareNo { get; set; }
    
    public class AustralianMedicareNumberOnlyAttribute : ValidationAttribute
    {
        private string exampleNumber = "Example: 2234 56789 1-2";
    
        public AustralianMedicareNumberOnlyAttribute()
        {
            ErrorMessage = string.Concat("{0} is not in correct format, ", exampleNumber);
        }
    
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value != null)
            {
                string objectValueString;
                int[] checksumDigits = new int[] { 1, 3, 7, 9, 1, 3, 7, 9 };
                int checksumDigit;
                int checksumtotal = 0;
                int checksumDigitCalculated;
    
                //convert incomming object value to string
                objectValueString = Convert.ToString(value).Trim();
    
                // check medicare number format should be 1234 56789 1-2
                if (!Regex.IsMatch(objectValueString, @"^[2-6]\d{3}\s\d{5}\s\d{1}-\d{1}$"))
                {
                    return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
                }
                else
                { 
                    //Check checksum value
                    //--------------------
    
                    // replace two spaces and one dash
                    objectValueString = objectValueString.Replace(" ", "").Replace("-", "");
    
                    // 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))
                    for (int i = 0; i < checksumDigits.Length; i++)
                    {
                        int digit = Convert.ToInt32(objectValueString.Substring(i, 1));
    
                        checksumtotal += digit * checksumDigits[i];
                    }
    
                    //find out checksum digit
                    checksumDigit = Convert.ToInt32(objectValueString.Substring(8, 1));
                    checksumDigitCalculated = checksumtotal % 10;
    
                    // check calculated checksum with medicare checksum digit
                    if (checksumDigit!= checksumDigitCalculated)
                    {
                        return new ValidationResult("The Medicare Number is not Valid.");
                    }
    
                }
    
            }
    
            return ValidationResult.Success;
        }
    }
    
      validateMedicare(medicare) {
        let isValid = false;
    
        if (medicare && medicare.length === 10) {
          const matches = medicare.match(/^(\d{8})(\d)/);
    
          if (!matches) {
            return { invalid: true };
          }
    
          const base = matches[1];
          const checkDigit = matches[2];
          const weights = [1, 3, 7, 9, 1, 3, 7, 9];
    
          let sum = 0;
          for (let i = 0; i < weights.length; i++) {
            sum += parseInt(base[i], 10) * weights[i];
          }
    
          isValid = sum % 10 === parseInt(checkDigit, 10);
        }
    
        return isValid;
      }
    
    bool isMedicareValid(String input, {bool validateWithIrn = true}) {
      final medicareNumber = input.replaceAll(" ", "");
      final length = validateWithIrn ? 11 : 10;
    
      if (medicareNumber.length != length) {
        return false;
      }
    
      final multipliers = [1, 3, 7, 9, 1, 3, 7, 9];
      final regexp = RegExp("^(\\d{8})(\\d)", caseSensitive: false);
    
      final matches = regexp.allMatches(medicareNumber).toList();
    
      if (matches.length > 0 && matches[0].groupCount >= 2) {
        final base = matches[0].group(1);
        final checkDigit = matches[0].group(2);
        var total = Iterable.generate(multipliers.length)
            .fold(0, (current, index) => current += (int.tryParse(base[index]) * multipliers[index]));
    
        return (total % 10) == int.parse(checkDigit);
      }
      return false;
    }
    
    func validateMedicareNumber(input: String) -> Bool {
        let weights = [1, 3, 7, 9, 1, 3, 7, 9]
    
        // Remove all whitespace
        var trimmed = input.trimmingCharacters(in: .whitespacesAndNewlines)
            .components(separatedBy: .whitespaces)
            .joined()
    
        // The medicare card number has 8 digits identifier + 1 digit checksum + 1 digit issue number.
        // Either 9 or 10 numbers will be valid
        guard trimmed.count == 9 || trimmed.count == 10 else {
            return false
        }
    
        // Drop the issue number if it was added
        if trimmed.count == 10 {
            trimmed = String(trimmed.dropLast())
        }
    
        // The last digit is a checksum
        guard let lastElement = trimmed.last,
            let checkSum = Int(String(lastElement)) else {
            return false
        }
    
        // Remove the checksum from our input
        trimmed = String(trimmed.dropLast())
    
        // Multiply the numbers by weights
        let weightedNumbers: [Int] = trimmed.enumerated().map { index, element in
            guard let number = Int(String(element)) else {
                // -1 will throw the calculations out of the window which
                // will guarantee invalid checksum
                return -1
            }
    
            return number * weights[index]
        }
    
        // Validate the weighted numbers against the checksum
        return weightedNumbers.reduce(0, +) % 10 == checkSum
    }
    
    public class MedicareValidation : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            string medicareNumber = value.ToString();
    
            if (!(medicareNumber?.Length >= 10 && medicareNumber.Length < 12) || !medicareNumber.All(char.IsDigit))
                return false;
    
            var digits = medicareNumber.Select(c => (int)char.GetNumericValue(c)).ToArray();
            return digits[8] == GetMedicareChecksum(digits.Take(8).ToArray());
        }
    
        private int GetMedicareChecksum(int[] digits)
        {
            return digits.Zip(new[] { 1, 3, 7, 9, 1, 3, 7, 9 }, (m, d) => m * d).Sum() % 10;
        }
    }
    
    [DisplayName("Medicare Number")]  
    [MedicareValidation] 
    public string MedicareNumber {get; set;}