2010-05-09 59 views
2

怎麼這裏是我到目前爲止有:我需要改變郵政編碼爲一系列的點和線(條形碼),但我想不出

def encodeFive(zip): 

    zero = "||:::" 

    one = ":::||" 

    two = "::|:|" 

    three = "::||:" 

    four = ":|::|" 

    five = ":|:|:" 

    six = ":||::" 

    seven = "|:::|" 

    eight = "|::|:" 

    nine = "|:|::" 

    codeList = [zero,one,two,three,four,five,six,seven,eight,nine] 

    allCodes = zero+one+two+three+four+five+six+seven+eight+nine 

    code = "" 
    digits = str(zip) 
    for i in digits: 

     code = code + i  

    return code 

有了這個,我」會得到一個字符串中的原始郵政編碼,但是沒有一個數字會被編碼到條碼中。我已經想出瞭如何編碼一個數字,但它不會以五個數字相同的方式工作。

+1

您是否考慮過簡單地使用其中一種可用的條形碼字體呢? – 2010-05-09 18:59:41

回答

0

我不知道你是什麼語言usingm所以我做在C#中的例子:

int zip = 72353; 

string[] codeList = { 
    "||:::", ":::||", "::|:|", "::||:", ":|::|", 
    ":|:|:", ":||::", "|:::|", "|::|:", "|:|::" 
}; 
string code = String.Empty; 
while (zip > 0) { 
    code = codeList[zip % 10] + code; 
    zip /= 10; 
} 
return code; 

注意:不能郵政編碼轉換成字符串,並且將每個字符回數字,我用數字計算了數字。

只是爲了好玩,這裏是一個班輪:

return String.Concat(zip.ToString().Select(c => "||::::::||::|:|::||::|::|:|:|::||::|:::||::|:|:|::".Substring(((c-'0') % 10) * 5, 5)).ToArray()); 
+0

@ΤΖΩΤΖΙΟΥ:當我回答問題時,標籤不在那裏。 – Guffa 2010-05-09 21:08:16

+0

啊,好的。我沒有檢查修訂歷史記錄以查看修正的內容,但無論如何,我刪除了我的評論。 – tzot 2010-05-09 21:23:07

1

你只是添加i(在digits字符)的地方,我想你想的字符串,添加codeList[int(i)]

只需使用字典進行查找,代碼可能會簡單得多。

+0

應該是'codeList [int(i)]',因爲'i'是當前例子中的一個字符串。 – Autoplectic 2010-05-09 19:14:41

+0

你是對的!我沒有想到使用int(i)。非常感謝! – Maggie 2010-05-09 22:35:35

4
codeList = ["||:::", ":::||", "::|:|", "::||:", ":|::|", 
    ":|:|:", ":||::", "|:::|", "|::|:", "|:|::" ] 
barcode = "".join(codeList[int(digit)] for digit in str(zipcode)) 
+2

附加說明:zip是一種內置的python方法,最好使用其他變量名稱。 – KillianDS 2010-05-09 19:30:04

+0

固定。我很少使用'zip()'(列表解析或生成器通常更合適),我有時忘記它存在。 – 2010-05-09 21:12:21

0

這是用python編寫的。

number = ["||:::", 
    ":::||", 
    "::|:|", 
    "::||:", 
    ":|::|", 
    ":|:|:", 
    ":||::", 
    "|:::|", 
    "|::|:", 
    "|:|::" 
    ] 
def encode(num): 
    return ''.join(map(lambda x: number[int(x)], str(num))) 

print encode(32345) 
+1

讓Python代碼看起來比Perl更不可讀的方法 – 2010-05-09 19:43:11

+0

雖然你的代碼是正確的,但字典(帶有「0」,「1」...作爲鍵)看起來更可取。 – tzot 2010-05-09 20:48:01

+0

@ΤΖΩΤΖΙΟΥ在開始我做了一個字典,但爲了使例子​​更清晰,我決定使用「數組」。 – msemelman 2010-05-10 13:30:56

2

也許使用字典:

barcode = {'0':"||:::", 
      '1':":::||", 
      '2':"::|:|", 
      '3':"::||:", 
      '4':":|::|", 
      '5':":|:|:", 
      '6':":||::", 
      '7':"|:::|", 
      '8':"|::|:", 
      '9':"|:|::", 
      } 

def encodeFive(zipcode): 
    return ''.join(barcode[n] for n in str(zipcode)) 

print(encodeFive(72353)) 
# |:::|::|:|::||::|:|:::||: 

PS。最好不要命名變量zip,因爲這樣做會覆蓋builtin function zip.而且類似地,最好避免將變量code命名爲標準庫中的code is a module

1

我覺得它更容易使用分裂()創建的字符串列表:

codes = "||::: :::|| ::|:| ::||: :|::| :|:|: :||:: |:::| |::|: |:|::".split() 

def zipencode(numstr): 
    return ''.join(codes[int(x)] for x in str(numstr)) 

print zipencode("32345") 
0

看來你想生成一個「POSTNET」條形碼。請注意,ZIP + 4郵政條碼廢棄了五位ZIP郵政編碼條碼,這些條碼已被ZIP + 4 + 2投遞點郵政網條碼廢棄,所有這些條碼都應包含校驗碼數字以及開頭和結尾的成幀條。無論如何,所有這些形式都被新的「智能郵件」4狀態條碼廢棄,這些條碼需要大量的計算代碼才能生成,而不再依賴於直接的數字到條形映射。搜索USPS.COM瞭解更多詳情。

相關問題