21 lines
1.4 KiB
AutoHotkey
21 lines
1.4 KiB
AutoHotkey
UPC2Dec(code){
|
|
lBits :={" ## #":0," ## #":1," # ##":2," #### #":3," # ##":4," ## #":5," # ####":6," ### ##":7," ## ###":8," # ##":9}
|
|
xlBits:={"# ## ":0,"# ## ":1,"## # ":2,"# #### ":3,"## # ":4,"# ## ":5,"#### # ":6,"## ### ":7,"### ## ":8,"## # ":9}
|
|
rBits :={"### # ":0,"## ## ":1,"## ## ":2,"# # ":3,"# ### ":4,"# ### ":5,"# # ":6,"# # ":7,"# # ":8,"### # ":9}
|
|
xrBits:={" # ###":0," ## ##":1," ## ##":2," # #":3," ### #":4," ### #":5," # #":6," # #":7," # #":8," # ###":9}
|
|
UPC := "", CD := 0, code := Trim(code, " ")
|
|
S := SubStr(code, 1, 3), code := SubStr(code, 4) ; start or "upside down" end sequence
|
|
loop 6
|
|
C := SubStr(code, 1, 7), code := SubStr(code, 8) ; six left hand or "upside down" right hand digits
|
|
, UPC := lBits[C] <> "" ? UPC . lBits[C] : xrBits[C] . UPC
|
|
M := SubStr(code, 1, 5), code := SubStr(code, 6) ; middle sequence
|
|
loop 6
|
|
C := SubStr(code, 1, 7), code := SubStr(code, 8) ; six right hand or "upside down" left hand digits
|
|
, UPC := rBits[C] <> "" ? UPC . rBits[C] : xlBits[C] . UPC
|
|
E := SubStr(code, 1, 3), code := SubStr(code, 4) ; end or "upside down" start sequence
|
|
for k, v in StrSplit(UPC)
|
|
CD += Mod(A_Index, 2) ? v*3 : v ; Check Digit
|
|
if (S <> "# #") || (M <> " # # ") || (E <> "# #") || Mod(CD, 10)
|
|
return "Invalid!"
|
|
return UPC
|
|
}
|