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日)提供的正则表达式有助于验证允许的字符,但下面的检查算法应足以验证数字是否符合医疗保险规则 医疗保险卡号包括:
- 八位数字李>
- 一个校验位(一位);及
- 发行编号(一位数字)
资料来源:“医疗保健软件系统中医疗保健标识符的使用-软件一致性要求,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;}