当zipcode以0开头或以0结尾时,程序不运行

时间:2016-10-18 06:56:21

标签: java barcode zipcode

我的任务是为用户输入的邮政编码创建一个条形码。我找不到一种方法,如果用户输入以0开头的邮政编码(即05123)或者校验位为0(即10027),则可以给我一个正确的结果。有人有建议吗?我是初学java类。

public class Zipcode{

private String zipcode = "";
private String barcode = "";
private String tempCode = "";
private int zipnum = 0;
private int zipnumForCD = 0;
private int checkDigit = 0;
private int reversedZip = 0;
private int digitSum = 0;


 public Zipcode(int zip_number){
    zipnum = zip_number;
    zipnumForCD = zip_number;
    getCheckDigit();
    createUpdatedZip();
    createBarcode();
}

public Integer getCheckDigit(){
    while (zipnumForCD > 0){
        digitSum = digitSum + zipnumForCD % 10;
        zipnumForCD = zipnumForCD/10;
    }
    if (digitSum % 10 == 0)
    {
        checkDigit = 0;
    }
    else
    {
        checkDigit = 10 - digitSum % 10;
    }
    return checkDigit;  
}

public void createUpdatedZip(){
    zipnum = Integer.valueOf(String.valueOf(zipnum) + String.valueOf(checkDigit));
    for (int i = zipnum; i !=0; i /= 10){
        reversedZip = reversedZip * 10 + i % 10;
    }
}

public void createBarcode(){
   while (reversedZip > 0){
        switch (reversedZip % 10)
        {
            case 0: 
                tempCode = "||:::";
                break;
            case 1: 
                tempCode = ":::||";
                break;
            case 2: 
                tempCode = "::|:|";
                break;
            case 3: 
                tempCode = "::||:";
                break;
            case 4: 
                tempCode = ":|::|";
                break;
            case 5: 
                tempCode = ":|:|:";
                break;
            case 6: 
                tempCode = ":||::";
                break;
            case 7: 
                tempCode = "|:::|";
                break;
            case 8: 
                tempCode = "|::|:";
                break;
            case 9: 
                tempCode = "|:|::";
                break;
            default:
                break;
        }
        reversedZip = reversedZip / 10;
        barcode += tempCode;

        }
    barcode = "|" + barcode + "|";
}

public String getBarcode(){
   return barcode;
}

}

这是我的测试人员课程:

import java.util.Scanner;

public class ZipTest{

public static void main(String[] args){
    Scanner input = new Scanner(System.in);

    System.out.println("Please enter a ZIP code: ");
    int zip = input.nextInt();
    Zipcode code = new Zipcode(zip);

    System.out.println("The bar code: ");
    System.out.println(code.getBarcode());
}
}

3 个答案:

答案 0 :(得分:1)

创建一个HashMap实例,您可以在其中存储相当于每个字符的条形码,从'0'到'9'int数。

Hashmat<Character, String> charBarMap = new HashMap<Character, String>();
intBarMap.put('0',"||:::"); 
intBarMap.put('1',":::||");
...
...

由于你不能在int中使用前导0,你需要使用String格式的邮政编码。

从该字符串中检索每个字符并使用hashMap表获取该字符的条形码字符串表示形式(“0”到“9”)并继续追加到您的字符串。

 String st = "020080";

 StringBuilder barCode = new StringBuilder();

 for(int i=0; i<st.length(); i++){
      char c = st.charAt(i);
      barCode.append(charBarMap.get(c));
 }

答案 1 :(得分:0)

如果变量是一个字符串,你可以删除前导零...然后将其转换为int。 使用String.replaceFirst(String regex)删除前导零。 要转换为int,请使用类似这样的内容 int foo = Integer.parseInt(“1234”)

答案 2 :(得分:0)

你的问题是合乎逻辑的:1234号......那是什么:01234,或12340?!

因此,您无法将邮政编码表示为数字。相反,邮政编码唯一有效的格式是长度为5的字符串,只包含数字!

换句话说:你的类应该只将一个字符串作为构造函数的参数;并在那里你做进一步的验证(如检查长度/内容),如果传入的邮政编码无效,则抛出异常。

因此:在任何地方都没有转换为int;一切都发生在字符串/字符上。当然,您可以使用方法为索引0,1,2提供数字...作为int;但一般来说,你最好将ZIP表示为字符串!