2017-02-23 83 views
0

Я не могу писать на Ruby кода, но я нашел этот рубин коды для вычисления контрольной суммы для AEMO НХAEMO Контрольной сумма рубин код

def checksum 
    summation = 0 
    @nmi.reverse.split(//).each_index do |i| 
    value = nmi[nmi.length - i - 1].ord 
    value *= 2 if i.even? 
    value = value.to_s.split(//).map(&:to_i).reduce(:+) 
    summation += value 
    end 
    checksum = (10 - (summation % 10)) % 10 
    checksum 
end 

Может кто-то пожалуйста, помогите мне объяснить, что это значит эта строка?

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

Я пытаюсь преобразовать код, указанный выше, в VBA для Excel.

Для входа "4103738516" даст вам 8 "4102030716" ==> 2 "QFFF0000LV" ==> 7

в странице 40 этого документа содержит код 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

Спасибо Jagdeep :) –

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