AEMO校验和Ruby代码

我不能编写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(:+) 

我尝试将上面的代码转换为Excel的VBA。

对于input“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 

阅读更多关于注入这里。

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