VIN (vehicle identification number) validator and input directive. See VIN Wikipedia for information on VIN
Vehicle VINs use a check digit system to determine if the VIN is valid. VINs past 1980 must have 17 digits, and they must be alphanumeric and NOT contain the letters I, Q, or O (likely to avoid confusion with numbers).
First, you can add to your bower.json if you want to use that:
"angular-vin": "rfink/angular-vin"
Or simply run
bower install angular-vin
Angular-vin only requires angular (in production). To use in your angular app, add "angular-vin" to your dependencies:
var myApp = angular.module('myApp', ['angular-vin']);
Then, you can add "vin-input" directive inside your html. You can also specify a callback from scope to call when the VIN is successfully input and validate. Also, the module sets 4 different validity properties depending on what is invalid (see below)
<input vin-input vin-is-valid="onValid" name="vin" ng-model="vin" />
<div ng-show="form.vin.$error.invalidlength">Vin too short</div>
<div ng-show="form.vin.$error.invalidchars">Invalid characters</div>
<div ng-show="form.vin.$error.invalidcheckdigit">Check digit does not match</div>
The directive prevents invalid characters, adds a max length to the input element, and automatically converts input to upper-case.
Controller code:
myApp.controller('MyCtrl', function MyCtrl($scope) {
$scope.onValid = function(vin) {
console.log(vin + ' is a valid VIN');
};
});
You can opt out of using the directive and simply use the service.
myApp.controller('MyCtrl', function MyCtrl($scope, vinValidatorService) {
var result = vinValidatorService.validate('11111111111111111');
if (result.valid) {
// Do things
}
});
For the sake of completeness, the vinValidatorService exports additional properties relating to VIN validation. These are:
- vinLength - equal to 17
- checkDigitIndex - equal to 8 (9th position in the VIN)
- invalidChars - 'OQI'
- regEx - "[A-HJ-NPR-Z0-9]{17}"
- replaceRegEx - "[^A-HJ-NPR-Z0-9]"
- characterMap - map of alphabet characters to numeric value
- weights - weights based on index position
grunt karma
grunt build