2017-02-23 6 views
0

は、誰かがこの行が何を意味する説明するために、私を助けていただけますか?AEMOチェックサムRubyのコード

value = value.to_s.split(//).map(&:to_i).reduce(:+) 

私はExcelのための上記のコードをVBAに変換しようとしています。 "4103738516" の入力については

は、本書の40ページに、あなたに8 "4102030716" ==> 2 "QFFF0000LV" ==> 7

を与えるだろう、それを計算するためにJavaScriptコードを持っていますが、私がすることができますコードを理解していない。

https://www.aemo.com.au/-/media/Files/PDF/0610-0008-pdf.pdf

方が良いという声明を理解させる必要がありますあなたのコードの下

答えて

1

ありがとう:

# Say 
value = 82478923 # any random number 
value.to_s   # => "82478923" 

# `split(//)` is similar to `split` and `split('')`, they split a string after each character to generate an array of characters. 
ary = value.to_s.split(//)  # => ["8", "2", "4", "7", "8", "9", "2", "3"] 

ary.map(&:to_i)  # => [8, 2, 4, 7, 8, 9, 2, 3] 

# `inject(:+)` will iterate the array and calculate sum of all numbers 
ary.map(&:to_i).inject(:+)  # => 43 

はここinjectについては、こちらをご覧ください。

+0

はあなたにジャグディープありがとう:) –

0

誰にでも必要な場合は、このRubyコードをVBAに翻訳します。

使用法:Calc_Checksum(NMI)

Function StrReverse(strInput As String) As String 

    Dim strRev As String 
    Dim i As Integer 
    Dim length As Integer 


    strRev = "" 
    length = Len(strInput) 

    For i = 0 To length - 1 
     strRev = strRev & Mid(strInput, length - i, 1) 
    Next i 

    StrReverse = strRev 

End Function 

Function Calc_Checksum(strNMI As String) 

    Dim i As Integer 
    Dim j As Integer 
    Dim x As Integer 
    Dim chrV As Integer 
    Dim tmpStr As String 

    Dim s As Integer 

    s = 0 
    ' Reverse strNMI 
    strNMI = StrReverse(strNMI) 


    'Loop through each char 
    For i = 0 To Len(strNMI) - 1 


     chrV = Asc(Mid(strNMI, i + 1, 1)) 
     'debug.Print chrV 

     If i Mod 2 = 0 Then 
      chrV = chrV * 2 
     End If 

     tmpStr = CStr(chrV) 
     v = 0 
     For j = 1 To Len(tmpStr) 

      v = v + CInt(Mid(tmpStr, j, 1)) 

     Next j 

     s = s + v 

    Next i 


    Calc_Checksum = (10 - (s Mod 10)) Mod 10 

End Function