簡體   English   中英

字符串,整數和前導零

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM