2014-10-16 9 views
5

Czy ktoś kiedykolwiek stworzył VIN Validator? Próbuję utworzyć pole tekstowe, w którym użytkownik wprowadzi numer identyfikacyjny pojazdu, a następnie JS/jQuery sprawdzi poprawność, jeśli jest poprawny lub nie, na wypadek gdyby błędnie podał numer.JavaScript/jQuery VIN Validator

Jestem bardzo nowy w JS/jQuery i znalazłem kilka przykładów, ale oczywiście nie były w stanie sprawić, by działały poprawnie ... Każdy, kto ma jakieś pomysły lub sugestie, byłby bardzo doceniany, szczególnie jeśli potrafisz powiedz mi, jak skonfigurować to, co mam poniżej, aby działało poprawnie!

Uwaga: isVin() function uprzejmości cflib.org

HTML:

<label name="vin">VIN</label> 
<input type="text" name="vin" /> 

ColdFusion:

<cfscript> 
/** 
* US Vehicle Identification Number (VIN) validation. 
* version 1.0 by Christopher Jordan 
* version 1.1 by RHPT, Peter Boughton &amp; Adam Cameron (original function rejected valid VINs) 
* 
* @param v  VIN to validate (Required) 
* @return Returns a boolean. 
* @author Christopher Jordan ([email protected]) 
* @version 1, February 19, 2013 
*/ 
function isVIN(v) { 
    var i = ""; 
    var d = ""; 
    var checkDigit = ""; 
    var sum = 0; 
    var weights = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2]; 
    var transliterations = { 
     a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8, 
     j = 1, k = 2, l = 3, m = 4, n = 5,   p = 7,   r = 9, 
       s = 2, t = 3, u = 4, v = 5, w = 6, x = 7, y = 8, z = 9 
    }; 
    var vinRegex = "(?x) ## allow comments 
     ^     ## from the start of the string 
          ## see http://en.wikipedia.org/wiki/Vehicle_Identification_Number for VIN spec 
     [A-Z\d]{3}   ## World Manufacturer Identifier (WMI) 
     [A-Z\d]{5}   ## Vehicle decription section (VDS) 
     [\dX]    ## Check digit 
     [A-Z\d]    ## Model year 
     [A-Z\d]    ## Plant 
     \d{6}    ## Sequence 
     $     ## to the end of the string 
    "; 

    if (! REFindNoCase(vinRegex, arguments.v)) { 
     return false; 
    } 

    for (i = 1; i <= len(arguments.v); i++) { 
     d = mid(arguments.v, i, 1); 

     if (! isNumeric(d)) { 
      sum += transliterations[d] * weights[i]; 
     } else { 
      sum += d * weights[i]; 
     } 
    } 

    checkDigit = sum % 11; 

    if (checkDigit == 10) { 
     checkDigit = "x"; 
    } 
    return checkDigit == mid(arguments.v, 9, 1); 
} 
</cfscript> 

Code Test:

<cfoutput> 
<cfset vin = "1GNDM19ZXRB170064"> 
#vin#: #isVin(vin)#<br /> 
<cfset vin = "1FAFP40634F172825"> 
#vin#: #isVin(vin)#<br /> 
</cfoutput> 
+3

Jeśli twój kod nie działa, opisz dokładnie, w jaki sposób nie działa. Czy powoduje to komunikaty o błędach? Złe odpowiedzi? Brak odpowiedzi? – Pointy

+0

'writeOutput (" # vin #: #isVin (vin) #
");' wygląda dziwnie – epascarello

+1

'' oznacza, że ​​został stworzony dla ColdFusion i nie zadziała, jeśli po prostu umieścisz go na swojej stronie. – Spokey

Odpowiedz

8

Oto rozwiązanie po stronie klienta za pomocą wyrażeń regularnych.

$(function() { 
 
    $("#vin").on("keyup blur", function() { 
 
    if (validateVin($("#vin").val())) 
 
     $("#result").html("That's a VIN"); 
 
    else 
 
     $("#result").html("Not a VIN"); 
 
    }); 
 
}); 
 
    
 
function validateVin(vin) { 
 
    var re = new RegExp("^[A-HJ-NPR-Z\\d]{8}[\\dX][A-HJ-NPR-Z\\d]{2}\\d{6}$"); 
 
    return vin.match(re); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<label name="vin">VIN</label> 
 
<input type="text" id="vin" value="1FAFP40634F172825" /> 
 
<span id="result"></span>

+1

Ta odpowiedź sprawdza tylko format ciągu znaków, ale nie sprawdza poprawności "cyfry kontrolnej" i jest najważniejsza. – jlgsoftware

7

Jeśli dekodowanie VIN dla pojazdów sprzedawanych w Ameryce Północnej można potwierdzić następujące:

  1. Że VIN jest 17 cyfr
  2. Jeśli 17 cyfr, że cyfra kontrolna (9 pozycja) jest poprawna

Podczas sprawdzania numeru VIN w czasie rzeczywistym, gdy użytkownik go wpisuje, ważne jest, aby być wydajnym. Oznacza to, że błąd kończy się niepowodzeniem podczas wpisywania przez użytkownika. Podczas korzystania z wyrażenia regularnego w tym zadaniu jest znacznie wolniej niż po prostu sprawdzanie długości numeru VIN. Gdy VIN ma 17 cyfr, możesz zweryfikować cyfrę kontrolną (która, nawiasem mówiąc, sama jest również szybsza niż regex - patrz poniżej).

Wyrażenia regularne nie są dobrym rozwiązaniem dla walidacji VIN na kilka powodów:

  1. wydajność. Nie jest to tak szybkie, jak proste sprawdzenie długości, a kompromis w zakresie prędkości nie zapewnia tak dużej poprawy dokładności, ponieważ nie można zweryfikować cyfry kontrolnej.

  2. Dokładność. Chociaż to prawda, możesz upewnić się, że numer VIN jest zgodny z prawidłowym wzorcem pod względem długości i ważnych znaków, co nie jest wystarczające. KNDJB723025140702 jest prawidłowym numerem VIN, natomiast KNDJB723025140703 nie jest (jedyną różnicą jest ostatnia cyfra). Rozwiązanie regex pokaże oba numery VIN jako ważne, z których drugi będzie fałszywie dodatni, a zatem niepoprawny.

Wikipedia ma really good script do wykonywania cyfrowy poprawności wyboru, które również nie powiedzie się szybko tylko walidacji cyfrę kontrolną, jeżeli VIN jest 17 cyfr.

, poniższy skrypt jest dużo, musi być szybszy (około 40x) niż użycie wyrażenia regularnego, aby potwierdzić VIN, i ma dodatkową zaletę polegającą na zwracaniu dokładnych wyników.

$(function() { 
 
    var $ctrl = $('#vin'), 
 
    $msg = $('#validation-message'); 
 

 
    $ctrl.keyup(function() { 
 
    if (validateVin($ctrl.val())) { 
 
     $msg.html("VIN is valid!"); 
 
    } else { 
 
     $msg.html("VIN is not valid"); 
 
    } 
 
    }); 
 
}); 
 

 
function validateVin(vin) { 
 
    return validate(vin); 
 

 

 
    // source: https://en.wikipedia.org/wiki/Vehicle_identification_number#Example_Code 
 
    // --------------------------------------------------------------------------------- 
 
    function transliterate(c) { 
 
    return '.ABCDEFGH..JKLMN.P.R..STUVWXYZ'.indexOf(c) % 10; 
 
    } 
 

 
    function get_check_digit(vin) { 
 
    var map = 'X'; 
 
    var weights = '8765432X098765432'; 
 
    var sum = 0; 
 
    for (var i = 0; i < 17; ++i) 
 
     sum += transliterate(vin[i]) * map.indexOf(weights[i]); 
 
    return map[sum % 11]; 
 
    } 
 

 
    function validate(vin) { 
 
     if (vin.length !== 17) return false; 
 
     return get_check_digit(vin) === vin[8]; 
 
    } 
 
    // --------------------------------------------------------------------------------- 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
VIN: 
 
<input id="vin" type="text" /> 
 
<span id="validation-message"></span>

[1] pojazdów sprzedawanych w UE zazwyczaj nie używać cyfrę kontrolną, a dla niektórych samochodach może być nawet 18 cyfr (Mercedes).

+0

Nie działa poprawnie, mówi, że WDF44781313229645 jest nieprawidłowy, i jest to – Hictus

+1

Zaktualizowałem swoją odpowiedź, aby wskazać, że jest ona przeznaczona tylko dla pojazdów północnoamerykańskich (i tych, które używają cyfr kontrolnych). Większość samochodów sprzedawanych w UE nie używa cyfry kontrolnej. W takim przypadku, dla prostoty, rozwiązanie regex jest prawdopodobnie lepsze, jednak niektóre numery VIN mogą mieć długość 18 cyfr, więc może być konieczne pewne parsowanie WMI (pierwsze 3 cyfry). –

Powiązane problemy