2012-11-02 68 views
3

我實現了一個函數,將一個整數轉換爲一個字符串intToStr()(代碼如下)。爲什麼Python在它前面有一個0時改變整數的值?

爲了測試我的一些值已經過去了,觀察到一個意想不到的輸出:

print intToStr(1223) # prints 1223 as expected 
print intToStr(01223) # prints 659, surprisingly 

現在,我已經嘗試調試它,而我傳遞的整數確實變成了是659

爲什麼會發生這種情況,我怎樣才能讓python忽略整數字面的前導零?


下面是我的函數代碼:

def intToStr(i): 
    digits = '' 
    if i == 0: 
     return 0 
    result = "" 
    while i > 0: 
     result = digits[i%10] + result 
     i /= 10 
    return result 
+0

,因爲它變成八進制 – sherpya

+1

使用'lstrip('0')'去除'0'。 –

回答

4

正如其他人說,因爲八進制數。但我強烈建議你給你的函數更改爲:

>>> from functools import partial 
>>> force_decimal = partial(int, base=10) 
>>> force_decimal("01") 
1 
>>> force_decimal("0102301") 
102301 

這樣,您將顯式強制轉換爲基座10和INT不會被推斷爲你。

+0

我不知道這一點,謝謝你的這條信息! :)你是唯一一個這樣說過的人! :) –

+0

@GamesBrainiac:但是因爲你將*從int轉換爲str *它不是最明顯的建議,因爲這是從str到int *的轉換。 :-) –

+0

@MartijnPieters,我知道,我只是想知道是否有辦法做到這一點。你永遠不知道你需要什麼。 –

9

0開頭的文字一個整數被解釋爲octal number, base 8

>>> 01223 
659 

這在Python 3中,其中被改變帶有前導0的整數被認爲是錯誤:

>>> 01223 
    File "<stdin>", line 1 
    01223 
     ^
SyntaxError: invalid token 
>>> 0o1223 
659 

你不應該指定一個前導零的整數文字;如果你打算指定一個八進制數,使用0o來啓動它,否則去掉這些零。

1

0開頭的數字被解釋爲octal numbers。 如果它以0x開頭,它是十進制的十六進制數。

0

前導零導致Python將您的數字解釋爲八進制(base-8)。

要去掉的零(假設num是一個字符串),這樣做:

num.lstrip("0") 
相關問題