/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
EAN (European Article Number, европейский номер товара) — европейский стандарт штрих-кода, предназначенный для кодирования идентификатора товара и производителя. Является надмножеством американского стандарта UPC. Формат кода EAN13 позволяет закодировать строку длиной 12 символов, 13-й является контрольным числом, рассчитываемым на основе первых 12 по определенной формуле.
Имеются разные платные и бесплатные библиотеки для генерации EAN-13 в Java. Вячеслав Арчибасов написал свой класс, который реализован на Java, работает в J2ME и Android.
Создадим новый проект и добавим в него новый класс EAN13CodeBuilder, предназначенный для кодирования последовательности 12 чисел в строку текста в EAN-13, которую затем можно отобразить на экране с помощью специального шрифта. Используется класс очень просто - в конструктор передается исходная строка, затем метод getCode() возвращает строку в EAN-13. Исходный код класса выглядит так:
package ru.alexanderklimov.ean13generator;
public class EAN13CodeBuilder {
private String codeStringValue;
private String generatedCode;
public EAN13CodeBuilder(String codeString) {
codeStringValue = codeString;
parse();
}
public String getCode() {
return generatedCode;
}
private String getFullCode() {
int chetVal = 0, nechetVal = 0;
String codeToParse = codeStringValue;
for (int index = 0; index < 6; index++) {
chetVal += Integer.valueOf(
codeToParse.substring(index * 2 + 1, index * 2 + 2))
.intValue();
nechetVal += Integer.valueOf(
codeToParse.substring(index * 2, index * 2 + 1)).intValue();
}
chetVal *= 3;
int controlNumber = 10 - (chetVal + nechetVal) % 10;
if (controlNumber == 10)
controlNumber = 0;
codeToParse += String.valueOf(controlNumber);
return codeToParse;
}
private String DigitToUpperCase(String digit) {
String letters = "ABCDEFGHIJ";
int position = Integer.valueOf(digit).intValue();
String retVal = letters.substring(position, position + 1);
return retVal;
}
private String DigitToLowerCase(String digit) {
String letters = "abcdefghij";
int position = Integer.valueOf(digit).intValue();
String retVal = letters.substring(position, position + 1);
return retVal;
}
private String createEAN13Code(String rawCode) {
int firstFlag = Integer.valueOf(
rawCode.substring(0, 1)
).intValue();
String leftString = rawCode.substring(1, 7);
String rightString = rawCode.substring(7);
String rightCode = "";
String leftCode = "";
for (int i = 0; i < 6; i++) {
rightCode += DigitToLowerCase(rightString.substring(i, i + 1));
}
if (firstFlag == 0) {
leftCode = "#!" + leftString.substring(0, 1)
+ leftString.substring(1, 2) + leftString.substring(2, 3)
+ leftString.substring(3, 4) + leftString.substring(4, 5)
+ leftString.substring(5);
}
if (firstFlag == 1) {
// /System.out.println("leftString: "+leftString);
leftCode = "$!" + leftString.substring(0, 1)
+ leftString.substring(1, 2)
+ DigitToUpperCase(leftString.substring(2, 3))
+ leftString.substring(3, 4)
+ DigitToUpperCase(leftString.substring(4, 5))
+ DigitToUpperCase(leftString.substring(5));
}
if (firstFlag == 2) {
leftCode = "%!" + leftString.substring(0, 1)
+ leftString.substring(1, 2)
+ DigitToUpperCase(leftString.substring(2, 3))
+ DigitToUpperCase(leftString.substring(3, 4))
+ leftString.substring(4, 5)
+ DigitToUpperCase(leftString.substring(5));
}
if (firstFlag == 3) {
leftCode = "&!" + leftString.substring(0, 1)
+ leftString.substring(1, 2)
+ DigitToUpperCase(leftString.substring(2, 3))
+ DigitToUpperCase(leftString.substring(3, 4))
+ DigitToUpperCase(leftString.substring(4, 5))
+ leftString.substring(5);
}
if (firstFlag == 4) {
leftCode = "'!" + leftString.substring(0, 1)
+ DigitToUpperCase(leftString.substring(1, 2))
+ leftString.substring(2, 3) + leftString.substring(3, 4)
+ DigitToUpperCase(leftString.substring(4, 5))
+ DigitToUpperCase(leftString.substring(5));
}
if (firstFlag == 5) {
leftCode = "(!" + leftString.substring(0, 1)
+ DigitToUpperCase(leftString.substring(1, 2))
+ DigitToUpperCase(leftString.substring(2, 3))
+ leftString.substring(3, 4) + leftString.substring(4, 5)
+ DigitToUpperCase(leftString.substring(5));
}
if (firstFlag == 6) {
leftCode = ")!" + leftString.substring(0, 1)
+ DigitToUpperCase(leftString.substring(1, 2))
+ DigitToUpperCase(leftString.substring(2, 3))
+ DigitToUpperCase(leftString.substring(3, 4))
+ leftString.substring(4, 5) + leftString.substring(5);
}
if (firstFlag == 7) {
leftCode = "*!" + leftString.substring(0, 1)
+ DigitToUpperCase(leftString.substring(1, 2))
+ leftString.substring(2, 3)
+ DigitToUpperCase(leftString.substring(3, 4))
+ leftString.substring(4, 5)
+ DigitToUpperCase(leftString.substring(5));
}
if (firstFlag == 8) {
leftCode = "+!" + leftString.substring(0, 1)
+ DigitToUpperCase(leftString.substring(1, 2))
+ leftString.substring(2, 3)
+ DigitToUpperCase(leftString.substring(3, 4))
+ DigitToUpperCase(leftString.substring(4, 5))
+ leftString.substring(5);
}
if (firstFlag == 9) {
leftCode = ",!" + leftString.substring(0, 1)
+ DigitToUpperCase(leftString.substring(1, 2))
+ DigitToUpperCase(leftString.substring(2, 3))
+ leftString.substring(3, 4)
+ DigitToUpperCase(leftString.substring(4, 5))
+ leftString.substring(5);
}
String retVal = leftCode + "-" + rightCode + "!";
return retVal;
}
private void parse() {
String fullString = getFullCode();
System.out.println("Full code: " + fullString);
generatedCode = createEAN13Code(fullString);
System.out.println("Generated code: " + generatedCode);
}
}
Осталось поместить в папку assets/fonts нужный шрифт, разместить на форме текстовую метку для отображения кода и кнопку для ее генерации. Размер шрифта для TextView желательно выбрать побольше (android:textSize="100dp"):
public void onButtonClick(View v){
TextView tvBarcode = (TextView)findViewById(R.id.tvBarcode);
/// установить шрифт штрих-кода
Typeface font = Typeface.createFromAsset(this.getAssets(), "fonts/EanP72Tt Normal.Ttf");
tvBarcode.setTypeface(font);
EAN13CodeBuilder bb = new EAN13CodeBuilder("124958761310");
tvBarcode.setText(bb.getCode());
}