B4X:
Sub Globals
Dim decoders As Map
Dim FNC1 As String = Chr(29) ' se vuoi puoi cambiare Chr(29) con "-"
End Sub
Sub Activity_Create(FirstTime As Boolean) 'ignore
' creo mappa dei decoders
decoders.Initialize
' Lnn = fixed length, nn digits
' Fnn = float, nn digit
' Vnn = variable, nn max length
' D6 = date
' https://it.wikipedia.org/wiki/GS1-128
decoders.Put("00","L18")
decoders.Put("01", "L14")
decoders.Put("02", "L14")
decoders.Put("10", "V20")
decoders.Put("11", "D6")
decoders.Put("12", "D6")
decoders.Put("13", "D6")
decoders.Put("15", "D6")
decoders.Put("17", "D6")
decoders.Put("20", "L2")
decoders.Put("21", "V20")
decoders.Put("22", "V29")
' ....... qui lascio a te aggiungere tutti gli altri che ti servono
decoders.Put("30", "V8")
' da 310 a 369 sono tutti Float, non serve definirli
' da 390 a 394 sono tutti Float variabili, non serve definirli
'....
'....
decoders.Put("415", "L13")
decoders.Put("416", "L13")
decoders.Put("422", "V3") 'Paese di Origine nato
decoders.Put("423", "V15") 'Paese di sezionato
decoders.Put("424", "V3") 'Paese di Allevato
decoders.Put("425", "V15") 'Paese di Macellato
decoders.Put("426", "V3") ' Paese da capire meglio
decoders.Put("427", "V3") ' Paese da capire meglio
decoders.Put("8020", "V25")
' eccetera eccetera, devi aggiungere tutti quelli che ti servono
' --------------------------------------------------------------------
' test di decodifica
Dim mappa As Map = Decodifica("422380423380" & FNC1 & "424380425380")
Log(mappa)
' Dim mappa As Map = Decodifica("010123456789012810123456789" & FNC1 & "21987654321")
' Log(mappa)
' Dim mappa As Map = Decodifica("01980081105541283103009140172309201002743989")
' Log(mappa)
' Dim mappa As Map = Decodifica("41580320890098748020123456789123456789392205799")
' Log(mappa)
' Dim mappa As Map = Decodifica("01080320890000173103002584392200646")
' Log(mappa)
' Dim mappa As Map = Decodifica("01080320890000173103002584392200646" & FNC1 & "393200314")
' Log(mappa)
ExitApplication
End Sub
Sub Decodifica(codice As String) As Map
' F = fix
' D = decimal
' V = variable
' D = date
Dim mappa As Map
mappa.Initialize
Do While codice <> ""
If codice.StartsWith(FNC1) Then
codice = codice.SubString(1)
If codice = "" Then Exit
End If
' ----------------------------------------------------------------------------------------
' per primo cerco i codici a due cifre
Dim cod As String = codice.SubString2(0, 2)
Dim decoder As String = decoders.Get(cod)
If decoder = "null" Then
cod = codice.SubString2(0, 3) ' ora cerco quelli a 3 cifre
decoder = decoders.Get(cod)
If decoder = "null" Then
Dim codInt As Int = cod
If codInt >= 310 And codInt <= 369 Then ' prima di tutto controllo che non siano i valore Float
decoder = "F6"
End If
If codInt >= 390 And codInt <= 394 Then ' controllo che non sia un Float Variabile
decoder = "F0" ' float a lunghezza variabile
End If
If decoder = "null" Then
' provo con quelli a 4 cifre
cod = codice.SubString2(0, 4)
decoder = decoders.Get(cod)
If decoder = "null" Then
Msgbox("Codice AI " & cod & " non riconosciuto", "ERRORE") 'ignore
Return Null
End If
End If
End If
End If
Dim len As Int = decoder.SubString(1)
Select decoder.SubString2(0, 1) ' estraggo il tipo (L, F, D, V)
Case "L" ' lunghezza fissa
mappa.Put(cod, codice.SubString2(cod.Length, cod.Length + len))
codice = codice.SubString(cod.Length + len)
Continue
Case "F" ' float
Dim decimali As Int = codice.SubString2(cod.Length, cod.Length + 1)
Dim valore As String
If len = 0 Then ' lunghezza variabile
Dim vn As String = codice.SubString(cod.Length + 1).IndexOf(FNC1)
If vn = -1 Then
valore = codice.SubString(cod.Length + 1)
len = valore.Length
Else
valore = codice.SubString2(cod.Length + 1, cod.Length + 1 + vn)
len = codice.SubString2(cod.Length, cod.Length + vn).Length + 1
End If
Else
' lunghezza fissa
valore = codice.SubString2(cod.Length + 1, cod.Length + 1 + len)
End If
Dim intero As String = valore.SubString2(0, valore.Length - decimali)
Dim frazione As String = valore.SubString(intero.Length)
Dim valoreFloat As Float = intero & "." & frazione
mappa.Put(cod, valoreFloat)
codice = codice.SubString(cod.Length + 1 + len)
Continue
Case "D" ' data ddMMyy
DateTime.DateFormat = "yyMMdd"
Dim data As String = codice.SubString2(cod.Length, cod.Length + len)
Dim dataLong As Long = DateTime.DateParse(data)
mappa.Put(cod, dataLong)
codice = codice.SubString(cod.Length + len)
Continue
Case "V" ' variabile
Dim vn As String = codice.SubString(cod.Length).IndexOf(FNC1)
If vn = -1 Then
Dim valore As String = codice.SubString(cod.Length)
If valore.Length > len Then
valore = valore.SubString2(0, len)
End If
mappa.Put(cod, valore)
codice = codice.SubString(cod.Length + valore.Length)
Else
If vn > len Then vn = len
mappa.Put(cod, codice.SubString2(cod.Length, cod.Length + vn))
codice = codice.SubString(cod.Length + vn)
End If
Continue
End Select
Loop
Return mappa
End Sub