[英]Strings, ints and leading zeros
我需要在一個對象上記錄SerialNumber。 我們輸入許多物體。 大多數序列號都是字符串 - 數字不是數字使用的,就像唯一標識符一樣 - 但它們通常是順序的。 此外,由於序列號的唯一ID狀態,前導零是重要的。
在進行數據輸入時,最好只輸入第一個“順序”序列號(例如000123),然后輸入項目數(例如5個)以獲得所需的輸出 - 這樣我們可以批量輸入數據,如下所示:
Obj1.serial = 000123
Obj2.serial = 000124
Obj3.serial = 000125
Obj4.serial = 000126
Obj5.serial = 000127
問題是當你取第一個數字作為字符串,轉向整數和增量時,你松開前導零。
並非所有序列都是連續的 - 並非所有序列都是偶數(例如FDM-434 \\ RRTASDVI908)
但那些,我想自動進入。
在python中,在迭代之前在字符串中檢查前導零(*和,我猜,像0009999這樣的邊緣情況)的最優雅方法是什么,然后在增量后重新應用這些零?
我有一個解決這個問題的方法,但它並不優雅。 事實上,它是最無聊和最直接的alg。
這個問題有優雅的解決方案嗎?
編輯
為了澄清這個問題,我希望序列在增量后具有相同的位數。
因此,在大多數情況下,這將意味着重新應用相同數量的前導零。 但在某些邊緣情況下,前導零的數量將減少。 例如:009 - > 010; 0099 - > 0100
試試str.zfill()
:
>>> s = "000123"
>>> i = int(s)
>>> i
123
>>> n = 6
>>> str(i).zfill(n)
'000123'
您可以提前檢查字符串的長度,然后使用rjust
填充到相同的長度:
>>> s = "000123"
>>> len_s = len(s)
>>> i = int(s)
>>> i
123
>>> str(i).rjust(len_s, "0")
'000123'
您可以使用以下方法檢查所有數字的序列號:
if serial.isdigit():
我在這里開發我的評論, Obj1.serial
是一個字符串:
Obj1.serial = "000123"
('%0'+str(len(Obj1.serial))+'d') % (1+int(Obj1.serial))
這就像@ owen -s的回答'%06d' % n
:打印數字並用前導0填充。
關於'%d' % n
,它只是一種打印方式 。 來自PEP3101 :
在Python 3.0中,%運算符由更強大的字符串格式化方法format()補充。 對str.format()方法的支持已經被反向移植到Python 2.6。
所以你可能想要使用格式...無論如何,你在%
符號的右邊有一個整數,它將替換左邊字符串中的%d
。
'%06d'
表示打印最少6(6)位(d)長,必要時填寫0(0)。
由於Obj1.serial
是一個字符串,您必須在增量之前將其轉換為整數: 1+int(Obj1.serial)
。 因為右邊是一個整數,我們可以這樣做。
現在,對於左邊部分,由於我們不能硬編碼6,我們必須采用Obj1.serial
的長度。 但這是一個整數,所以我們必須將它轉換回一個字符串,並連接到表達式的其余部分%0 6 d : '%0'+str(len(Obj1.serial))+'d'
。 從而
('%0'+str(len(Obj1.serial))+'d') % (1+int(Obj1.serial))
現在,使用格式( 格式規范 ):
'{0:06}'.format(n)
以相同的方式替換
('{0:0'+str(len(Obj1.serial))+'}').format(1+int(Obj1.serial))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.