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));
}
}

