2013-04-22 98 views
-1

校驗位計算需要用於描述的新算法

字母中的數字和字母被賦值。 0 - 9 0 - 9 A - ,Z是10 - 35和空間36。

例字符串: CA5B9AJ1564 ...

計算:
C = 12
A = 10
5 = 5
B = 11
9 = 9
A = 10
J = 19
1 = 1
5 = 5
6 = 6
4 = 4

每個值相乘以降序從36到1,如下所示:
36 * 12 = 432
35 * 10 = 350
34 * 5 = 170
33 * 11 = 363
32 * 9 = 288
31 * 10 = 310
30 * 19 = 570
29 * 1 = 29
28 * 5 = 140
27×6 = 162
26 * 4 = 104

= 2918

2918然後通過37 = 78除以R 32
32的剩餘部分被減去從被除數= 37 - 32 =
5位是校驗位

我需要協助上述算法轉換成系列的嵌套循環或在vb.net私人潛艇。我想使用Mod運算符,因爲我們現在在公司使用的公式是3。我在Excel中手動運行3個不同的字符串。
目前代碼:(關閉的3測試串)

Private Function CheckDigit37(ByVal FieldString As String) 
     Dim String36Value As Integer 
     Dim PositionIndex As Integer 
     Dim LastPosition As Integer 
     Dim CharIndex As Integer 
     Dim CharString As String 
     Dim Value37 As Long 
     Dim Remainder As Long 
     Dim CheckDigitValue As Integer 
     Dim CheckDigit As String = " " 

     If FieldString = "" Then 
      Return False 
     Else 
      FieldString = FieldString.ToUpper 
      String36Value = RoundUp(FieldString.Length/36) 
     End If 

     For PositionIndex = 1 To String36Value 
      If FieldString.Length = 36 Then 
       LastPosition = 36 
      ElseIf PositionIndex < String36Value Then 
       LastPosition = 36 
      Else 
       LastPosition = FieldString.Length - 36 * (PositionIndex - 1) 
      End If 

      For CharIndex = 1 To LastPosition 
       CharString = Mid(FieldString, CharIndex + (PositionIndex - 1) * 36, 1) 
       'If CharString = "" Then GoTo EndLoop 
       Select Case CharString 
        Case 0 
         Value37 = Value37 + 0 * (37 - CharIndex) 
        Case 1 
         Value37 = Value37 + 1 * (37 - CharIndex) 
        Case 2 
         Value37 = Value37 + 2 * (37 - CharIndex) 
        Case 3 
         Value37 = Value37 + 3 * (37 - CharIndex) 
        Case 4 
         Value37 = Value37 + 4 * (37 - CharIndex) 
        Case 5 
         Value37 = Value37 + 5 * (37 - CharIndex) 
        Case 6 
         Value37 = Value37 + 6 * (37 - CharIndex) 
        Case 7 
         Value37 = Value37 + 7 * (37 - CharIndex) 
        Case 8 
         Value37 = Value37 + 8 * (37 - CharIndex) 
        Case 9 
         Value37 = Value37 + 9 * (37 - CharIndex) 
        Case "A" 
         Value37 = Value37 + 10 * (37 - CharIndex) 
        Case "B" 
         Value37 = Value37 + 11 * (37 - CharIndex) 
        Case "C" 
         Value37 = Value37 + 12 * (37 - CharIndex) 
        Case "D" 
         Value37 = Value37 + 13 * (37 - CharIndex) 
        Case "E" 
         Value37 = Value37 + 14 * (37 - CharIndex) 
        Case "F" 
         Value37 = Value37 + 15 * (37 - CharIndex) 
        Case "G" 
         Value37 = Value37 + 16 * (37 - CharIndex) 
        Case "H" 
         Value37 = Value37 + 17 * (37 - CharIndex) 
        Case "I" 
         Value37 = Value37 + 18 * (37 - CharIndex) 
        Case "J" 
         Value37 = Value37 + 19 * (37 - CharIndex) 
        Case "K" 
         Value37 = Value37 + 20 * (37 - CharIndex) 
        Case "L" 
         Value37 = Value37 + 21 * (37 - CharIndex) 
        Case "M" 
         Value37 = Value37 + 22 * (37 - CharIndex) 
        Case "N" 
         Value37 = Value37 + 23 * (37 - CharIndex) 
        Case "O" 
         Value37 = Value37 + 24 * (37 - CharIndex) 
        Case "P" 
         Value37 = Value37 + 25 * (37 - CharIndex) 
        Case "Q" 
         Value37 = Value37 + 26 * (37 - CharIndex) 
        Case "R" 
         Value37 = Value37 + 27 * (37 - CharIndex) 
        Case "S" 
         Value37 = Value37 + 28 * (37 - CharIndex) 
        Case "T" 
         Value37 = Value37 + 29 * (37 - CharIndex) 
        Case "U" 
         Value37 = Value37 + 30 * (37 - CharIndex) 
        Case "V" 
         Value37 = Value37 + 31 * (37 - CharIndex) 
        Case "W" 
         Value37 = Value37 + 32 * (37 - CharIndex) 
        Case "X" 
         Value37 = Value37 + 33 * (37 - CharIndex) 
        Case "Y" 
         Value37 = Value37 + 34 * (37 - CharIndex) 
        Case "Z" 
         Value37 = Value37 + 35 * (37 - CharIndex) 
        Case " " 
         Value37 = Value37 + 36 * (37 - CharIndex) 
        Case Else 
         Value37 = Value37 + 0 * (37 - CharIndex) 
       End Select 
      Next 
     Next 

     Remainder = Value37 - Int(Value37/37) * 37 
     CheckDigitValue = 37 - Remainder 

     Select Case CheckDigitValue 
      Case 0 
       CheckDigit = 0 
      Case 1 
       CheckDigit = 1 
      Case 2 
       CheckDigit = 2 
      Case 3 
       CheckDigit = 3 
      Case 4 
       CheckDigit = 4 
      Case 5 
       CheckDigit = 5 
      Case 6 
       CheckDigit = 6 
      Case 7 
       CheckDigit = 7 
      Case 8 
       CheckDigit = 8 
      Case 9 
       CheckDigit = 9 
      Case "10" 
       CheckDigit = "A" 
      Case "11" 
       CheckDigit = "B" 
      Case "12" 
       CheckDigit = "C" 
      Case "13" 
       CheckDigit = "D" 
      Case "14" 
       CheckDigit = "E" 
      Case "15" 
       CheckDigit = "F" 
      Case "16" 
       CheckDigit = "G" 
      Case "17" 
       CheckDigit = "H" 
      Case "18" 
       CheckDigit = "I" 
      Case "19" 
       CheckDigit = "J" 
      Case "20" 
       CheckDigit = "K" 
      Case "21" 
       CheckDigit = "L" 
      Case "22" 
       CheckDigit = "M" 
      Case "23" 
       CheckDigit = "N" 
      Case "24" 
       CheckDigit = "O" 
      Case "25" 
       CheckDigit = "P" 
      Case "26" 
       CheckDigit = "Q" 
      Case "27" 
       CheckDigit = "R" 
      Case "28" 
       CheckDigit = "S" 
      Case "29" 
       CheckDigit = "T" 
      Case "30" 
       CheckDigit = "U" 
      Case "31" 
       CheckDigit = "V" 
      Case "32" 
       CheckDigit = "W" 
      Case "33" 
       CheckDigit = "X" 
      Case "34" 
       CheckDigit = "Y" 
      Case "35" 
       CheckDigit = "Z" 
      Case "36" 
       CheckDigit = " " 
      Case "37" 
       CheckDigit = "0" 
     End Select 

     Return CheckDigit 
    End Function 

回答

0

如果我讀了你的問題,你的代碼的權利,這聽起來像你想生成一個給定的字符串檢查字符串值(即,如果它是1 ,檢查值是1,如果是B,檢查值是11)。我不完全確定你所提交的代碼會編譯(我沒有嘗試過),但是通過使用ASCII表和ChrAsc函數,你可以大大減少這些代碼。

0-9的ASCII值是48-55,A-Z的ASCII值是65-90。從第一組中減去48和從第二組中減去48將匹配你算法應用的值。

與其做一堆舍入和字符串操作,我認爲一次循環一個字符的字符串會更容易,執行必要的操作,然後將結果轉換爲校驗位的對應值。例如:

Private Function CheckDigit37(ByVal FieldString As String) As String 

    Dim CharIndex As Integer = 36 
    Dim Value37 As Long 
    Dim CheckDigitValue As Integer 
    Dim CheckDigit As String = "" 
    ' This will hold the character we're currently evaluating 
    Dim C As Char 

    FieldString = FieldString.ToUpper() 

    For i As Integer = 0 To FieldString.Length - 1 

     ' If CharIndex has reached 0 and we still have characters left, 
     ' change it back to 36 
     If (CharIndex = 0) Then 
      CharIndex = 36 
     End If 

     ' Get the next character in the string 
     C = FieldString(i) 

     If (IsNumeric(C)) Then 
      ' Subtract 48 from the ASCII value to get the algorithm value 
      Value37 = Value37 + (CharIndex * (Asc(C) - 48)) 
     ElseIf (Asc(C) >= 65 AndAlso Asc(C) <= 90) Then 
      ' Subtract 55 from the ASCII value to get the algorithm value 
      Value37 = Value37 + (CharIndex * (Asc(C) - 55)) 
     ElseIf (Asc(C) = 32) Then 
      ' We have a space (ASCII 32) 
      Value37 = Value37 + (CharIndex * 36) 
     End If 

     ' Decrease the CharIndex by 1 
     CharIndex = CharIndex - 1 
    Next 

    CheckDigitValue = 37 - (Value37 Mod 37) 

    If (CheckDigitValue <= 9) Then 
     ' We have a number 
     CheckDigit = Chr(CheckDigitValue + 48) 
    ElseIf (CheckDigitValue = 36) Then 
     ' We have a space 
     CheckDigit = Chr(32) 
    Else 
     ' We have A - Z 
     CheckDigit = Chr(CheckDigitValue + 55) 
    End If 

    Return CheckDigit 
End Function 

這給出了你的例子的值爲5。

我還使用了一個更長的字符串「CA5B9AJ15642ACKUQ02DA023MSAEWDSE924ADSCAA21」,得到了CheckDigitValue爲21和CheckDigit爲「L」。

+0

這個作品絕對完美,我一次嘗試過太多的嵌套fors ... – eyoung100 2013-04-23 19:06:29