Il codice EAN13 o European Article Number 13, è un codice utilizzato per l’identificazione univoca di articoli in vendita nell’Unione Europea. Lo troviamo, in forma di codice a barre, su praticamente ogni articolo in vendita nei supermercati e può essere letto tranquillamente da lettori tradizionali e da smartphone Android, iOS, Symbian o RIM dotati di fotocamera. Vediamo in questo articolo un metodo Java per il calcolo della cifra di controllo di un codice EAN13.
Per le sue caratteristiche di universalità e facilità di lettura il codice EAN13 si presta molto ad usi differenti da quelli per cui è stato inizialmente progettato, come ad esempio i servizi di bigliettazione o di identificazione univoca tagliandi. In questi contesti si sfrutta il payload informativo del codice per immagazzinare un ID univoco che permetta di effettuare query verso un database contenente informazioni sul pagamento o sull’anagrafica associata ad un determinato tagliando.
Il formato del codice supporta 12 cifre (0-9) informative, mentre il 13-esimo carattere è detto check digit, ed è un carattere di controllo che ha la funzione di consentire la verifica di corretta lettura del barcode.
Il calcolo di questa cifra avviene secondo un algoritmo molto elementare, a partire dalle 12 cifre iniziali:
- si sommano tutte le cifre in posizione pari (partendo a contare da 0 e da sinistra, considerando lo 0 come pari) e si ottiene il valore A
- si sommano tutte le cifre in posizione dispari e si moltiplica la somma per 3, ottenendo il valore B
- il check digit si ottiene facendo la differenza fra (A+B) e la decina superiore (e.g. se (A+B) = 123 il control digit è 7, se (A+B) = 120 il control digit è 0)
L’algoritmo è molto semplice, sotto un’implementazione Java che ad ELbuild usiamo in alcune web application.
package it.elbuild.blog.test; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Luca Adamo, luca@elbuild.it */ public class EAN13Test { public static void main(String[] args) { String ean_ = null; if(args.length!=1){ System.out.println("Please provide an input string of 12 chars."); System.exit(1); } else { ean_= args[0]; } try { System.out.println("EAN: "+ean_+"\tCHK: "+getEAN13CheckDigit(ean_)); } catch (Exception ex) { Logger.getLogger(EAN13Test.class.getName()).log(Level.SEVERE, null, ex); } } private static String getEAN13CheckDigit(String ean) throws Exception { if (ean.length() != 12) { throw new Exception("Please provide an input string of 12 chars. Current lenght: "+ean.length()); } long tot = 0; for (int i = 0; i < 12; i++) { tot = tot + (Long.parseLong(String.valueOf(ean.charAt(i))) * (i % 2 == 0 ? 1 : 3)); } return tot % 10 == 0 ? "0" : "" +(10-(tot % 10)); } }