AEMO 校验和 Ruby 代码

AEMO Checksum Ruby Code

我不会写 Ruby 代码,但我找到了这个 ruby 代码来计算 AEMO NMI 的校验和

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 for excel。

对于“4103738516”的输入会给你 8 “4102030716” ==> 2 "QFFF0000LV" ==> 7

在本文档的第 40 页中有 JavaScript 代码来计算它,但我看不懂代码。

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

谢谢

下面的代码应该可以让您更好地理解该语句:

# 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 的更多信息。

如果有人需要,我将此 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