简介
商品条码,或者EAN是欧洲标准条码。该条码被作为商品和商品制造商的唯一标识,同时,是美国标准UPC的超集。EAN-13由前十二位数字和第十三位作为校验位的数字组成。其中第十三位数字由前十二位数字按照一定公式计算得出。
如今,各个领域都有条码的应用。如果你以写代码为生,你的程序需要支持条码是早晚的事儿。比如超市的会员打折系统,用户以手机获取的条码作为唯一标识,来获得折扣。又比如支付系统中的星巴克支付系统。本文中,我们将讨论如何在安卓系统中生成EAN-13条码。
EAN-13计算基础
EAN-13采用的是是各位商品码,第十三位作为校验位。该校验位有前十二位数字生成。生成校验位的算法如下(数据从左到右计数):
P1 = 偶数位的数字和
P2 = 奇数位的数字和
Z = P1 + 3 * P2
R = 取个位数作为Z值
校验位 = R - Z
下面我们看一下EAN-13的编码结构:
首位不参与计算
随后六位根据首位数字编码
末六位以下列规则转换
首位 左六位 右六位
0 LLLLLL RRRRRR
1 LLGLGG RRRRRR
2 LLGGLG RRRRRR
3 LLGGGL RRRRRR
4 LGLLGG RRRRRR
5 LGGLLG RRRRRR
6 LGGGLL RRRRRR
7 LGLGLG RRRRRR
8 LGLGGL RRRRRR
9 LGGLGL RRRRRR
位编码:
Digit L - code G - code R - code
0 0001101 0100111 1110010
1 0011001 0110011 1100110
2 0010011 0011011 1101100
3 0111101 0100001 1000010
4 0100011 0011101 1011100
5 0110001 0111001 1001110
6 0101111 0000101 1010000
7 0111011 0010001 1000100
8 0110111 0001001 1001000
9 0001011 0010111 1110100
应用
文章尾部,我贴出了一个用十二位数字生成EAN-13条码的类EAN13CodeBuilder。这个类可以把生成的十三位数字的每一位都替换为可以展示到屏幕的特殊字体。该字体包括了一些特殊字符,比如$,+,!和其如上所述的十个数字的编码L,R,G。在EAN-13条码必须以以下方式生成:起始界定符(取决于第一位数字)-左六位-中间分隔符-右六位-终止符(!)
Digit L - code G - code R -code Start delimiter
0 0 A a #!
1 1 B b $!
2 2 C c %!
3 3 D d &!
4 4 E e '!
5 5 F f (!
6 6 G g )!
7 7 H h *!
8 8 I i +!
9 9 J j ,!
我们需要做的,仅仅是用数字生成正确的字符串,并用特殊字体展示而已。
这个类的使用非常简单。它将原始字符串传递给构造函数,之后调用getcode()方法取回EAN-13条码。这个类的源代码如下:
代码如下 | 复制代码 |
public class EAN13CodeBuilder { private String codeStringValue; private String generatedCode; public EAN13CodeBuilder(String codeString) { codeStringValue = codeString; parse(); } public String getCode() { return generatedCode; } //////////////////////////////////////////////////////////////// // this method generates EAN 13 control number ans returns full // string to encode 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; } ////////////////////////////////////////////// // this method generates EAN 13 encoded string // algorithm can be found at http://en.wikipedia.org/wiki/EAN-13 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 ) { 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 ); } } |
代码
为了生成一个在线条码,并将它展示到安卓屏幕上,你可能需要自己生成条码并用其中的特殊字符展示到屏幕上。为了在安卓系统的TextView 部件中设置字符集,你需要在工程文件的 /assets 下放置一个文件,加载Typeface 并且设置Typeface 到TextView 中:
代码如下 | 复制代码 |
import android.app.Activity; |