पाइथन में मुद्रा प्रारूपण


155

मैं पायथन का उपयोग करके 188518982.18 से £ 188,518,982.18 जैसे नंबर को प्रारूपित करना चाहता हूं।

मैं यह कैसे कर सकता हूँ?


आपने @RailsSon के नीचे एक टिप्पणी में एक उत्कृष्ट बिंदु बनाया: आप एक विशिष्ट मुद्रा प्रदर्शित करने के लिए £ प्रिंट करना चाहते हैं, लेकिन वित्तीय संख्याओं के लिए एक जापानी अभिव्यक्ति का उपयोग करके उस प्रदर्शन को नियोजित करते हैं। मुझे यह अजीब लगता है कि आपके अनुरोध को localeमुद्रा के मूल्य के मॉड्यूल के उपयोग और उस मुद्रा के प्रदर्शन गुणों को डिकोड करके भाषा में लागू नहीं किया गया है ।
दरोगाओं

जवाबों:


212

लोकेल मॉड्यूल देखें ।

यह मुद्रा (और तारीख) प्रारूपण करता है।

>>> import locale
>>> locale.setlocale( locale.LC_ALL, '' )
'English_United States.1252'
>>> locale.currency( 188518982.18 )
'$188518982.18'
>>> locale.currency( 188518982.18, grouping=True )
'$188,518,982.18'

15
मैं एक गैर-देशी मुद्रा को सही ढंग से कैसे प्रारूपित करूंगा, कहो मैं एक जापानी भाषा की रिपोर्ट के लिए जीबी पाउंड में एक लागत दिखा रहा हूं?
सिंगलएनजेशन इलिमिनेशन

2
@TokenMacGuy: यह एक ट्रिक प्रश्न है। जापानी रिपोर्ट का अर्थ है जापानी अल्पविराम और दशमलव स्थान के नियम लेकिन जीबी पाउंड मुद्रा प्रतीक - लोकेल द्वारा समर्थित नहीं है। आपको एक अनुकूलित लोकेल परिभाषा बनानी होगी।
S.Lott

यदि दाता संख्या नकारात्मक है तो "()" के बीच का मान क्यों लौटाता है?
पंचक्रोशी २०

6
यह अभी भी मेरे लिए काम नहीं किया, लेकिन मैंने इसे बदल दिया locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')और इसने पूरी तरह से काम किया!
फ्यूरोबिनेटर

2
कोष्ठकों द्वारा निरूपित के रूप में नकारात्मक संख्या के लिए @panchicore लेखांकन की दुनिया में एक आम बात है। इसे oocalc या excel में आज़माएं, और संख्याओं को लेखांकन प्रकार में प्रारूपित करें।
दरोगांस

94

2.7 में नया है

>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'

http://docs.python.org/dev/whatsnew/2.7.html#pep-0378


6
यह साफ है, लेकिन वास्तव में इस सवाल का जवाब नहीं देता है, क्योंकि अनुरोध किए गए समाधान में एक मुद्रा प्रतीक शामिल होगा, और आप दशमलव के बाद अंकों की संख्या को हार्ड-कोडिंग भी कर रहे हैं, जो स्थानीय-विशिष्ट है। यदि आप कॉमा प्लेसमेंट नहीं चाहते हैं, तो स्वीकृत लोकेल उत्तर का उपयोग करने के कई और कारण हैं।
मैरोनी

6
@ मैरोनी स्वीकार किए गए स्थानीय उत्तर का उपयोग नहीं करने के कई कारण हैं, जैसे कि एक संपूर्ण मॉड्यूल आयात नहीं करना।
जोश

1
@ जोश, "स्थानीय आयात मुद्रा से"।
एंड्रयू एच।

5
@ मैरोनी: आप बस कर सकते हैं: '$ {: 0, .2f}'। प्रारूप (184467616.1), और अब आपके पास प्रतीक है
विजयी

@triunenature जो $ 123,456.78कभी-कभी हालांकि परिणाम होगा । संपादित करें: मार्कडाउन अतिरिक्त स्थानों को बाहर निकालता है, दिखावा करता है कि $ और संख्याओं के बीच अधिक है
साइबर जेक

48

यह बिल्कुल निश्चित नहीं है कि इसका अधिक ऑनलाइन उल्लेख क्यों नहीं किया गया है (या इस धागे पर), लेकिन एजगेल के लोगों का बैबल पैकेज (और Django उपयोगिताओं) मुद्रा प्रारूपण (और अन्य i18n कार्यों के बहुत सारे) के लिए भयानक है। यह अच्छा है क्योंकि यह कोर पायथन लोकेल मॉड्यूल की तरह विश्व स्तर पर सब कुछ करने की आवश्यकता से ग्रस्त नहीं है।

ओपी ने जो उदाहरण दिया वह बस होगा:

>>> import babel.numbers
>>> import decimal
>>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" )
£188,518,982.18

2
बहुत देर से नोट: यह परीक्षण, यह समझदारी से मुद्रा को प्रारूपित करने के लिए प्रकट नहीं होता है, क्योंकि यह केवल राशि से पहले उपयुक्त प्रतीक को चिपका देता है (जो आपके द्वारा निर्धारित लोकेल में दिखाई देता है, जो उचित है), चाहे वह वास्तव में मुद्रा हो उपसर्ग के रूप में इसके प्रतीक का उपयोग करता है।
कुंगफू

@kungphu तुम्हारा क्या मतलब है? देखें babel.pocoo.org/en/latest/api/…
जूलियन

1
@ जूलियन ऐसा लगता है कि इसका उपयोग करने के localeलिए तर्क का format_currencyउपयोग किया जा सकता है, लेकिन या तो वह चार साल पहले डॉक्टर में नहीं था (जब मैंने वह टिप्पणी लिखी थी) या मैंने सिर्फ इस उत्तर के कोड का परीक्षण किया है-जैसा कि डॉक्टर की जाँच के बिना है।
कुंगफू 6

1
@ कुंगफू गोत्र मैं कल इस पद की उम्र पर ध्यान नहीं दे रहा होगा। प्रलेखन / फ़ंक्शन बदलने की संभावना बहुत लगती है। चीयर्स!
जूलियन

32

यह एक प्राचीन पोस्ट है, लेकिन मैंने सिर्फ निम्नलिखित समाधान को लागू किया है:

  • बाहरी मॉड्यूल की आवश्यकता नहीं है
  • एक नया फ़ंक्शन बनाने की आवश्यकता नहीं है
  • इन-लाइन किया जा सकता है
  • कई चर संभालता है
  • नकारात्मक डॉलर की मात्रा को संभालता है

कोड:

num1 = 4153.53
num2 = -23159.398598

print 'This: ${:0,.0f} and this: ${:0,.2f}'.format(num1, num2).replace('$-','-$')

आउटपुट:

This: $4,154 and this: -$23,159.40

और मूल पोस्टर के लिए, स्पष्ट रूप से, बस स्विच $के लिए£


मेरे प्रारूप को कुछ अनुकूलन की आवश्यकता थी, लेकिन यह ठीक है क्योंकि मैं इस समाधान के साथ ऐसा करने में सक्षम था।
गधाकी जोंग

10
शांत विचार! पायथन 3.6 और एफ-स्ट्रिंग्स के साथ, यह और भी सुंदर लग रहा है:print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
तिमो सालोरंता

16

मेरी लोकेल सेटिंग अधूरी लग रही थी, इसलिए मैं भी इस SO उत्तर से परे था और पाया:

http://docs.python.org/library/decimal.html#recipes

ओएस स्वतंत्र

बस यहाँ साझा करना चाहता था।


लेकिन हम कहाँ बुलाते हैं def moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='')?
Roel

9

यदि आप OSX का उपयोग कर रहे हैं और आपके लोकल मॉड्यूल को सेट करना बाकी है, तो यह पहला उत्तर देने से काम नहीं चलेगा, आपको निम्न त्रुटि प्राप्त होगी:

Traceback (most recent call last):File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py", line 221, in currency
raise ValueError("Currency formatting is not possible using "ValueError: Currency formatting is not possible using the 'C' locale.

इसका उपाय करने के लिए आपको निम्नलिखित प्रयोग करने होंगे:

locale.setlocale(locale.LC_ALL, 'en_US')

2
locale.setlocale (locale.LC_ALL, 'en_US.UTF-8') मेरे लिए करता है
एलेक्सब्लम

9

"{:0,.2f}".format(float(your_numeric_value))पायथन 3 में काम करता है; यह निम्नलिखित लाइनों में से एक की तरह कुछ देता है:

10,938.29
10,899.00
10,898.99
2,328.99

6

अगर मैं तुम होते, मैं BABEL का उपयोग करता: http://babel.pocoo.org/en/latest/index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')

1
अजगर लोकेल मॉड्यूल मेरे लिए काम नहीं करता था (जो भी स्थानीय मैंने इसे सेट किया, उसने शिकायत की) लेकिन बबल की आवश्यकता है और इस फ़ंक्शन का उपयोग करना अच्छा है। एपीआई डॉक्स में यह देखने लायक है क्योंकि इसमें अधिक पैरामीटर और अधिक उपयोगी कार्य हैं (जैसे मुद्राओं के लिए:) format_currency
डैनियल डब्ल्यू

3

ओह, यह एक दिलचस्प जानवर है।

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

मैंने अपना स्वयं का व्यापक कार्यान्वयन लिखा है जो कि कीवी अजगर ढांचे का एक हिस्सा है, एलजीपीएल देखें: अन्य स्रोत यहां देखें:

http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup

कोड थोड़ा लिनक्स / ग्लिबक विशिष्ट है, लेकिन विंडोज़ या अन्य यूनिक्स को अपनाने के लिए बहुत मुश्किल नहीं होना चाहिए।

एक बार जब आप स्थापित कर लेते हैं तो आप निम्न कार्य कर सकते हैं:

>>> from kiwi.datatypes import currency
>>> v = currency('10.5').format()

जो तब आपको देगा:

'$10.50'

या

'10,50 kr'

वर्तमान में चयनित स्थान के आधार पर।

इस पोस्ट में मुख्य बात यह है कि यह अजगर के पुराने संस्करणों के साथ काम करेगा। locale.currency को अजगर 2.5 में पेश किया गया था।


क्या यह locale.currency () पर लाभ है?
अली अफशर

@AliAfshar: 10,50 krइसके बजाय एक फायदा होगा kr 10,50
user2394284

2

# वेरिएंट 'टोटल:' को इस फॉर्मेट में '9,348.237' जैसा दिखता है।

print ('Total:',   '{:7,.3f}'.format(zum1))

जहां '{: 7, .3f}' इस मामले में संख्या को स्वरूपित करने के लिए रिक्त स्थान की संख्या 3 दशमलव अंकों के साथ एक मिलियन है। फिर आप '.format (zum1) जोड़ें। Zum1 था चर है जो मेरे विशेष कार्यक्रम में सभी संख्या के योग के लिए बड़ी संख्या है। चर कुछ भी हो सकता है जिसे आप उपयोग करने का निर्णय लेते हैं।


1

उपरोक्त कोड से प्रेरित: डी

def money_format(value):
value = str(value).split('.')
money = ''
count = 1

for digit in value[0][::-1]:
    if count != 3:
        money += digit
        count += 1
    else:
        money += f'{digit},'
        count = 1

if len(value) == 1:
    money = ('$' + money[::-1]).replace('$-','-$')
else:
    money = ('$' + money[::-1] + '.' + value[1]).replace('$-','-$')

return money

0

मैं एक ही चीज को देखने आया हूं और पाया कि अजगर-पैसा वास्तव में अभी तक इसका उपयोग नहीं किया है, लेकिन शायद दोनों का मिश्रण अच्छा होगा


0

@ Nate के उत्तर की मदद से, एक फ़ंक्शन के अंदर इसकी गणना करने के लिए एक लंबोदर

converter = lambda amount, currency: "%s%s%s" %(
    "-" if amount < 0 else "", 
    currency, 
    ('{:%d,.2f}'%(len(str(amount))+3)).format(abs(amount)).lstrip())

और फिर,

>>> converter(123132132.13, "$")
'$123,132,132.13'

>>> converter(-123132132.13, "$")
'-$123,132,132.13'

अधिकांश देश मुद्रा प्रतीक का उपयोग राशि के बाद करते हैं, अन्य तरीके से नहीं।
जोनास बिस्ट्रॉम

@ जोंस शायद यही है कि ज्यादातर देश क्या करते हैं, लेकिन ओपी के पास यह राशि थी, इसलिए मैंने इसे अपने उत्तर में भी राशि से पहले ही पा लिया है :)
mu

0

सरल अजगर कोड!

def format_us_currency(value):
    value=str(value)
    if value.count(',')==0:
        b,n,v='',1,value
        value=value[:value.rfind('.')]
        for i in value[::-1]:
            b=','+i+b if n==3 else i+b
            n=1 if n==3 else n+1
        b=b[1:] if b[0]==',' else b
        value=b+v[v.rfind('.'):]
    return '$'+(value.rstrip('0').rstrip('.') if '.' in value else value)

1
आपका कोड रिटर्न तार की तरह "$2,129.1468284147656", "$10,948.3742933", "$1,0908"। स्ट्रिंग को तराशता है।
यूजीन जीआर। फिलीपोव

हां मैंने ध्यान नहीं दिया। आपने भी एम्स दिया है।
वंजिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.