gpt4 book ai didi

JavaScript/jQuery VIN 验证器

转载 作者:数据小太阳 更新时间:2023-10-29 04:23:30 29 4
gpt4 key购买 nike

有没有人创建过 VIN 验证器?我正在尝试创建一个文本框,用户将在其中输入车辆识别号,然后 JS/jQuery 将验证其是否正确,以防他们输入错误的号码。

我是 JS/jQuery 的新手,找到了一些示例,但当然无法让它们正常工作......任何人有任何想法或建议,我将不胜感激,特别是如果你能告诉我如何设置下面的内容才能正常工作!

注意:isVin() functioncflib.org 提供

HTML:

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

冷聚变:

<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 (cjordan@placs.net)
* @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>

测试代码:

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

最佳答案

如果您要解码在北美销售的车辆的 VIN1,您可以验证以下内容:

  1. VIN 的长度为 17 位
  2. 如果是 17 位,则校验位(第 9 位)是正确的

由于您将在用户输入 VIN 时实时检查它,因此保持高效非常重要。这意味着在用户输入时快速失败。虽然您可以使用正则表达式来完成此任务,但它比简单地检查 VIN 的长度要慢得多。一旦 VIN 为 17 位长,您就可以验证校验位(顺便说一下,校验位本身也比正则表达式更快 - 见下文)。

正则表达式不适用于 VIN 验证,原因如下:

  1. 表现。它不像简单地检查长度那么快,而且速度的权衡并不能使您在准确性上有太大的提高,因为您无法验证校验位。

  2. 准确性。虽然您确实可以确保 VIN 在长度和有效字符方面符合正确的模式,但这还不够。 KNDJB723025140702 是有效的 VIN,而 KNDJB723025140703 不是(唯一的区别是最后一个数字)。正则表达式解决方案将显示两个 VIN 均有效,而第二个为误报,因此不正确。

维基百科有一个 really good script 用于执行校验位验证,如果 VIN 是 17 位数字,它也会很快失败,因为仅验证校验位。

In my own testing,下面的脚本必须比使用正则表达式验证 VIN 快得多(大约 40 倍),并且它具有返回准确结果的额外好处。

$(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 '0123456789.ABCDEFGH..JKLMN.P.R..STUVWXYZ'.indexOf(c) % 10;
}

function get_check_digit(vin) {
var map = '0123456789X';
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] 在欧盟销售的车辆通常不使用校验位,有些汽车甚至可以使用 18 位数字(梅赛德斯)。

关于JavaScript/jQuery VIN 验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26407015/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com