我有一个 javascript 函数,我需要使用 Coldfusion8 在服务器端运行它。
javascript 函数使用 charCodeAt 检查输入的值(ILN,13 位值,例如 1234567891231)并计算 checkVal:
checker=0;
for (i=11; i>0; i=i-2){
checker += (iln.charCodeAt(i)-48)*3;
checker += iln.charCodeAt(i-1)-48;
}
checkVal = 10 - (checker%10);
if(checkVal==10){
checkVal=0;
}
if(checkVal != iln.charAt(12)){
alert("error, should be" + checkVal);
}
在 Coldfusion 中,我尝试使用循环 mid() 和 asc() 来执行此操作,但我无法让它工作。这是我所拥有的:
<cscript>
var checkValue = 1234567891231;
var done = "";
</cscript>
<cfloop from="11" to="1" index="i" step="-2">
<cfscript>
check = check + (ASC(MID(checkValue,#i#,1))-48)*3;
check = check + ASC(MID(checkValue,(#i#-1),1))-48;
</cfscript>
</cfloop>
<cfset done = 10 - check/10>
<cfif done EQ 10><cfset done = 0></cfif>
<cfif done NEQ mid(checkValue,12,1)>
<cfscript>
// error handler
</cfscript>
</cfif>
值已正确传递,但我的 ASC(MID()) 产生错误,我还没有发现我做错了什么。
有人可以指点一下吗?
谢谢!
编辑:更新了 CF 循环参数
EDIT2:将其固定到在最后一次循环迭代中获得 1-1=0 的第二个中间函数。
最佳答案
我不太明白这里的算法,但错误是因为你在做 Mid(string,0,1)
- 这是字符串开始前的一个字符,并且因此不起作用。 (JS 从零开始索引字符串,CF 从一开始索引。)
简单的解决方案:
<cfloop from="11" to="1" index="i" step="-2">
<cfset check += mid(checkValue,i,1) * 3 />
</cfloop>
<cfloop from="10" to="2" index="i" step="-2">
<cfset check += mid(checkValue,i,1) />
</cfloop>
它不会浪费时间执行 Asc
,因为值已经是数字(如果它们可能不是,请在此步骤之前验证输入),并且也没有不必要的散列。
关于javascript - 如何将使用 charCodeAt 的 javascript 函数转换为 Coldfusion?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10869280/