2016-10-18 97 views
1

我的任務是爲用戶輸入郵編創建一個條形碼。如果用戶輸入以0開始的郵政編碼(即05123)或校驗位爲0(即10027)的郵政編碼,我無法找到一種方法,以使它給我一個正確的結果。任何人都有建議?我在初學java班。當郵政編碼從0開始或以0結尾時,程序不運行

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

井,'int' doesn't有前導零,所以你可能要重新考慮該郵政編碼表示的是由'int'。我將切換到「String」。 – SomeJavaGuy

+0

@KevinEsche哦,這是真的!但如果它不是一個整數,你將如何去處理所有這些方法?即必須將郵政編碼除以10,等等。 –

+0

@jaynepants你不用10除,你用'charAt()'一次提取一個數字字符。 – Andreas

回答

0

如果variabel是一個字符串,你可以刪除前導零...然後將其轉換爲int。 用String.replaceFirst(String regex)刪除前導零。 要轉換爲int使用這樣的事情 INT富=的Integer.parseInt(「1234」)

+0

你知道目標是**不會失去前導零? – Fildor

0

你的問題是一個邏輯排序:數量1234 ...那是什麼:,或12340?

所以,你不能代表一個郵政編碼爲數字。相反,郵政編碼的唯一有效格式是長度爲5的字符串,該字符串只包含數字!

換句話說:你的類只應該把一個字符串作爲構造函數的參數;並在那裏進行進一步驗證(如檢查長度/內容),並在傳入的郵政編碼無效時拋出異常。

因此:沒有在任何地方轉換爲int;一切都發生在字符串/字符。當然,你可以有方法給你索引0,1,2 ...的數字爲int;但總體而言,您最好將ZIP表示爲字符串!

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

我只是把關鍵字的char值。 – Fildor