2012-10-10 2 views
6

में अल्पविराम और निर्दिष्ट सटीक अंकों के साथ एक संख्या को प्रारूपित करने के लिए कैसे प्रश्न Python 2.6 के लिए है, यह हमारे उत्पादन में है।पायथन

मेरे पास अल्पविराम के साथ एक संख्या (1234567.0987 या 1234567.0) स्वरूपण करने के लिए यह आवश्यकता है, और दशमलव बिंदुओं के बाद अंकों की निर्दिष्ट संख्या। तो, अगर यह परिशुद्धता तीन है, 1234567.0987 1,234,567.099 की तरह लग सकता है।

मैंने लोकेल का उपयोग करने की कोशिश की, जैसा कि कई सवालों के जवाब दिए गए हैं, समस्या यह है कि दशमलव के बाद दो अंक होते हैं, जो मेरी आवश्यकता के लिए स्वीकार्य नहीं है।

मैं अन्य स्थानों में खोज करने की कोशिश की, लेकिन किसी भी समाधान नहीं मिला, और अंत में मैं अपने खुद के द्वारा एक विधि बनाया:

def format_float(value, precision = 4): 
    formatString = "%0." + str(precision) + "f"  
    str_val = formatString % value 
    first, second = str_val.split('.') 
    first = int(first) 
    group = [] 
    while True: 
     result, mod = first/1000, first % 1000 
     group.append(str(mod)) 
     if result == 0: 
      break 
     first = result 
    group.reverse() 
    return ','.join(group) + '.' + second 

मैं विधि का परीक्षण करने के लिए कुछ परीक्षण चलाने के लिए करने की कोशिश की है और यह ठीक काम करता है :

# default 4 digits precision 
assert format_float(1234567890.0876543) == '1,234,567,890.0877' 
assert format_float(1.2) == '1.2000' 
assert format_float(1234) == '1,234.0000' 
assert format_float(0) == '0.0000' 

# 3 digits precision 
assert format_float(1234567890.0876543, precision=3) == '1,234,567,890.088' 
assert format_float(0, precision=3) == '0.000' 

पायथन के लिए नया होने के नाते, मेरा सवाल यह है कि यह एक स्वीकार्य समाधान है या नहीं। चूंकि इस स्वरूपण को तंग फॉर-लूप में कई बार किया जाना है, अगर कोई बेहतर समाधान को इंगित कर सकता है तो मैं सराहना करता हूं।

धन्यवाद और अजगर 2.7 और 3.x के लिए सभी

+2

इसे '1000000' के साथ आज़माएं। –

+0

मार्क, धन्यवाद। यह वही एक अच्छा बग है, मुझे इसे ठीक करने की ज़रूरत है। – cspider

+1

आपको 'लोकेल' मॉड्यूल का उपयोग करने की आवश्यकता नहीं है। प्रश्न का मेरा जवाब देखें [_ पायथन में एक पूर्णांक में अल्पविराम जोड़ने का सबसे आसान तरीका क्या है? _] (Http://stackoverflow.com/q/3909457/355230)। – martineau

उत्तर

18

मैं आपको नहीं लगता कि लोकेल मॉड्यूल में गहरी पर्याप्त देखा। locale.format() वह है जो आप चाहते हैं, लेकिन सुनिश्चित करें कि आप पहले लोकेल सेट करते हैं या आप समूहबद्ध नहीं होंगे।

>>> locale.setlocale(locale.LC_ALL, '') 
'en_US.UTF-8' 
>>> locale.format("%.4f", 12345.678912, grouping=True) 
'12,345.6789' 
+0

लोकेल जागरूक एफटीडब्ल्यू ... –

+1

+1 'लोकेल' मॉड्यूल के बारे में कभी नहीं जानता था। –

+0

@cdhowie, धन्यवाद, यह मेरे लिए भी काम करता है। मैं प्रारूप() विकल्प पर glossed। – cspider

12

को सादर आप की तरह कुछ कर सकते हैं:

>>> num=1234567890.0876543 
>>> "{0:,f}".format(num) 
'1,234,567,890.087654' 
>>> "{0:,.2f}".format(num) 
'1,234,567,890.08' 
>>> "{0:,f}".format(1234) 
'1,234.000000' 
+0

आह, मुझे इसे हराया। संयोग से, यह 2.7.3 – kreativitea

+0

@kreativitea में भी काम करता है बस इसे ऑनलाइन चेक करता है। मैंने इसे केवल पायथन 2.6 पर कोशिश की जहां यह काम नहीं करता है। –

+0

धन्यवाद, हालांकि, मैंने अपना मूल प्रश्न संपादित किया, यह प्रश्न Python 2.6 के लिए है। – cspider