2017-08-31 19 views
4

我想將字符串轉換爲python decimal。如何將字符串轉換爲德語區域設置的Python Decimal(用逗號代替點)

這工作

from decimal import * 
mystr = '123.45' 
print(Decimal(mystr)) 

但是,當我想用​​千個分隔符和場景,事實並非如此。 轉換爲浮動工作正常。

from locale import * 
setlocale(LC_NUMERIC,'German_Germany.1252') 
from decimal import * 
mystr = '1.234,56' 
print(atof(mystr)) 
print(Decimal(mystr)) 

返回float和錯誤

1234.56 
InvalidOperation: [<class 'decimal.ConversionSyntax'>] 

是否有將字符串轉換不通過浮動或hackier解決方案手動轉換它正確的方式? FYA,我目前哈克的解決辦法是:

print(Decimal(f'{atof(mystr):2.2f}')) 
+2

有什麼錯'小數(atof(mystr))'? (注意你的測試結果不匹配:在這裏我得到'1234.56') –

+0

@ Jean-FrançoisFabre我已經使用過了,並且在添加我生成的小數時會產生令人討厭的舍入錯誤。對我來說,它也感覺像是一個黑客... – 576i

+1

是的,有一些舍入誤差,但它是由於浮點表示,它不是真正的四捨五入。只是'Decimal'不能處理區域設置。對我來說,這看起來不像一個黑客。 –

回答

4

我做了一些研究和這裏是解決方案:

import decimal 
import locale 

locale.setlocale(locale.LC_ALL, 'de_DE') 
mystr = '1.234,56' 
num = locale.atof(mystr, decimal.Decimal) 

print('{}'.format(num)) 
print('{:n}'.format(num)) 

1234.56 
1.234,56 

下引擎locale.atof調用delocalize函數,它完全符合@lsma的建議。

+0

這看起來很有前途(並且非常好)。我會檢查它,並將其解決,如果它適用於我。 – 576i

+0

工程(幾乎)和足夠接受作爲答案。我必須在使用Python 3.6的德語Windows機器上使用'locale.setlocale(locale.LC_NUMERIC,'German_Germany.1252')',您的設置會導致「locale.Error:不支持的語言環境設置」。 – 576i

+0

@ 576i,我在ubuntu上測試過。語言環境名稱可能是特定於操作系統的,應該安裝使用。 – newtover

0

這裏有一個想法,基本上我們在轉換之前格式化根據語言環境的字符串:

from locale import * 
from decimal import * 

def format_decimal(s): 
    return '{0:n}'.format(s) 

setlocale(LC_NUMERIC,'German_Germany.1252') 
thousandSep = localeconv()['thousands_sep'] 
decimalPoint = localeconv()['decimal_point'] 
mystr = '1.234,56'.replace(thousandSep, '').replace(decimalPoint, '.') 
print(atof(mystr)) 
print(format_decimal(Decimal(mystr))) 
0

區域設置選項並沒有爲我工作,也許是因爲我很少該機在國際化的道路上,所以我提出只依賴於字符串操作的解決方案:

numbr = 1234.56 

mystr = '{:,.2f}'.format(numbr) # Ugly American format 
mystr_orig = mystr # Ugly (but saved for later!) American format 

mystr = mystr.replace(',', '{0}') 
mystr = mystr.replace('.', '{1}') 

print(mystr_orig) 
print(mystr.format('.', ',')) 
相關問題