2012-06-03 44 views
1

我有一個javascript函數,我需要使用Coldfusion8運行serverside。如何將使用charCodeAt的JavaScript函數轉換爲Coldfusion?

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:固定下來的第2中,功能上的最後一個循環迭代得到1-1 = 0。

回答

2

我不太明白這裏的算法,但錯誤是因爲你在做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因爲值已經數(如果它們可能不是,驗證在此步驟之前輸入),也沒有不必要的散列。

+0

剛剛發現這一點。另外我現在也沒有那10%3 = 1而只是10/3。 – frequent