পাইথনে মুদ্রার বিন্যাস


156

আমি পাইথন ব্যবহার করে 188518982.18 থেকে 188,518,982.18 এর মতো সংখ্যার ফর্ম্যাট করতে চাই।

কিভাবে আমি এটি করতে পারব?


আপনি নীচে একটি মন্তব্যে একটি দুর্দান্ত বক্তব্য রেখেছিলেন, @ রেইলসন: আপনি একটি নির্দিষ্ট মুদ্রা প্রদর্শন করতে £ গুলি মুদ্রণ করতে চান, তবে আর্থিক সংখ্যার জন্য জাপানি এক্সপ্রেশন ব্যবহার করে সেই প্রদর্শনটি নিয়োগ করুন। আমি আশ্চর্যের সাথে মনে করি যে 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
@ টোকেনম্যাকগুই: এটি একটি কৌশল কৌশল। জাপানি রিপোর্টের অর্থ জাপানি কমা এবং দশমিক স্থানের নিয়ম তবে জিবি পাউন্ডের মুদ্রার প্রতীক - তুচ্ছভাবে লোকেলের দ্বারা সমর্থিত নয়। আপনাকে একটি কাস্টমাইজড লোকেল সংজ্ঞা তৈরি করতে হবে।
এস.লোট

যদি প্রদত্ত সংখ্যাটি নেতিবাচক হয় তবে "()" এর মধ্যে কেন মান দেয়?
পাঁচিকোর

6
এটি এখনও আমার পক্ষে কাজ করে নি, তবে আমি এটিতে পরিবর্তন করেছি locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')এবং এটি পুরোপুরি কাজ করেছে!
Furbeenator

2
প্যারেন্টিওরে নেতিবাচক সংখ্যার জন্য চিহ্নিত হিসাবে বন্ধনীর দ্বারা চিহ্নিত করা অ্যাকাউন্টে জগতের একটি সাধারণ অভ্যাস। এটি ওক্যালক বা এক্সেলের মাধ্যমে চেষ্টা করে দেখুন এবং অ্যাকাউন্টিং টাইপের সংখ্যার ফর্ম্যাট করুন।
ড্রাগোগান

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
এটি পরিচ্ছন্ন তবে সত্যই প্রশ্নের উত্তর দেয় না, কারণ অনুরোধ করা সমাধানটিতে মুদ্রার প্রতীক অন্তর্ভুক্ত থাকবে এবং দশমিকের পরে আপনি অঙ্কের সংখ্যাও কঠোরভাবে কোডিং করছেন যা স্থানীয় নির্দিষ্ট specific আপনি যদি কেবল কমা প্লেসমেন্ট না চান তবে গ্রহণযোগ্য লোকাল উত্তরটি ব্যবহার করার আরও অনেক কারণ রয়েছে।
মুরুনি

6
@ শ্রুনি গ্রহণযোগ্য লোকেল উত্তরগুলি ব্যবহার না করার অনেকগুলি কারণ রয়েছে, যেমন একটি সম্পূর্ণ মডিউল আমদানি না করা।
জোশ

1
@ জোশ, "স্থানীয় আমদানি মুদ্রা থেকে"।
অ্যান্ড্রু এইচ

5
@mrooney: আপনি শুধু করতে পারি না: '$ {: 0, .2f}' ফরম্যাট (184467616.1), এবং এখন আপনি প্রতীক আছে।
triunenature

@ ট্রাইউনিয়েচার যা এর ফলে $ 123,456.78কখনও কখনও ঘটে । সম্পাদনা করুন: মার্কডাউন অতিরিক্ত স্থানগুলি বের করে,
tend

48

এটি কেন অনলাইনে (বা এই থ্রেডে) বেশি উল্লেখ করা হয়নি তা পুরোপুরি নিশ্চিত নয়, তবে বাবেল এজলওয়াল ছেলেরা থেকে প্যাকেজ (এবং জ্যাঙ্গো ইউটিলিটিস) মুদ্রা ফর্ম্যাট করার জন্য (এবং প্রচুর অন্যান্য আই 18 এন টাস্ক) দুর্দান্ত। এটি দুর্দান্ত কারণ এটি পাইথন লোকেল মডিউলের মূল পাইথন মডিউলের মতো বিশ্বব্যাপী সবকিছু করার প্রয়োজন থেকে ভোগেন না।

ওপি যে উদাহরণটি দিয়েছে তা হ'ল:

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

2
খুব দেরী নোট: এটি পরীক্ষা করে এটি মুদ্রার বিন্যাসে বুদ্ধিমানভাবে উপস্থিত হয় না, কারণ এটি পরিমাণের আগে উপযুক্ত চিহ্নটিকে সহজেই আঁকড়ে রাখে (আপনার নির্ধারিত স্থানীয় অবস্থানটি যা যুক্তিযুক্ত বলে মনে হয় তাতে বিন্যাসিত), মুদ্রাটি বাস্তবে কিনা তা নির্বিশেষে উপসর্গ হিসাবে তার প্রতীক ব্যবহার করে।
কুংফু

@ কুংফু আপনার মানে কি? Babel.pocoo.org/en/latest/api/…
জুলিয়ান

1
@ জুলিয়ান মনে হচ্ছে এটির সমাধানের জন্য localeযুক্তিটি format_currencyব্যবহার করা যেতে পারে তবে এটি চার বছর আগে ডকের মধ্যে ছিল না (যখন আমি এই মন্তব্যটি লিখেছিলাম) অথবা আমি এই উত্তরটির কোডটি ডকটি পরীক্ষা না করেই ঠিক যেমন পরীক্ষা করেছি।
কুংফু

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

এবং মূল পোস্টারের জন্য, অবশ্যই, কেবল স্যুইচ $করুন£


আমার ফর্ম্যাটের কিছু কাস্টমাইজেশন প্রয়োজন, তবে এটি ঠিক আছে কারণ আমি এই সমাধানটি দিয়ে তা করতে সক্ষম হয়েছি।
গাধা কং 21

9
দুর্দান্ত ধারণা! পাইথন ৩.6 এবং এফ-স্ট্রিং সহ এটি আরও সুন্দর দেখাচ্ছে:print(f'Value is: ${value:,.2f}'.replace('$-', '-$'))
টিমো সালোরান্টা

16

আমার লোকাল সেটিংসটি অসম্পূর্ণ বলে মনে হয়েছিল, তাই আমি এই এসও উত্তরটির বাইরেও সন্ধান করেছি এবং পেয়েছি:

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

অপারেটিং সিস্টেম স্বাধীন

শুধু এখানে ভাগ করতে চেয়েছিলেন।


কিন্তু আমরা কোথায় ফোন করব def moneyfmt(value, places=2, curr='', sep=',', dp='.', pos='', neg='-', trailneg='')?
রোল

9

আপনি যদি ওএসএক্স ব্যবহার করে থাকেন এবং এখনও নিজের স্থানীয় মডিউলটি সেট করে রেখেছেন তবে এই প্রথম উত্তরটি কাজ করবে না আপনি নিম্নলিখিত ত্রুটিটি পাবেন:

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') আমার জন্য না
alexblum

9

"{:0,.2f}".format(float(your_numeric_value))পাইথন 3 এ কাজ করে; এটি নিম্নলিখিত লাইনের একটির মতো কিছু দেয়:

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

6

আমি যদি আপনি থাকতাম তবে আমি ব্যাবেল: 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'

বর্তমানে নির্বাচিত লোকেলের উপর নির্ভর করে।

এই পোস্টটির অপরটির মূল বিষয়টি হ'ল এটি পাইথনের পুরানো সংস্করণগুলির সাথে কাজ করবে। লোকাল সিউরেন্সির অজগর 2.5 তে চালু হয়েছিল।


এটির স্থানীয় সুবিধা () এর চেয়েও কী সুবিধা রয়েছে?
আলী আফশার

@ অলিআফশার: এর 10,50 krপরিবর্তে একটি সুবিধা হবে kr 10,50
ব্যবহারকারী 2394284

2

# 9,348.237 'এর মতো দেখতে এমন বিন্যাসে' মোট: 'পরিবর্তনশীল মুদ্রণ করা হচ্ছে

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

যেখানে '{: 7, .3f}' এ ক্ষেত্রে সংখ্যাটি ফর্ম্যাট করার জন্য স্পেসের সংখ্যা 3 দশমিক পয়েন্ট সহ মিলিয়ন। তারপরে আপনি '। ফর্ম্যাট (জুম 1) যুক্ত করুন। জুম 1 থ্যা ভেরিয়েবল যা আমার বিশেষ প্রোগ্রামে সমস্ত সংখ্যার যোগফলের জন্য বড় সংখ্যা রয়েছে। পরিবর্তনশীল এমন কোনও কিছু হতে পারে যা আপনি ব্যবহার করার সিদ্ধান্ত নেন।


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

@ নেটের উত্তরের সাহায্যে একটি ফাংশনের অভ্যন্তরে এটি গণনা করার জন্য একটি ল্যাম্বদা

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'

বেশিরভাগ দেশ এই পরিমাণের পরে মুদ্রা প্রতীক ব্যবহার করে, অন্যভাবে নয়।
জোনাস বাইস্ট্রোম

@ জোনাস সম্ভবত বেশিরভাগ দেশ এটিই করে, তবে ওপি পরিমাণের আগে এটি পেয়েছিল, তাই আমার জবাবের পরিমাণেরও আগে এটি পেয়েছি :)
মি 無

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"। গারবলস স্ট্রিং।
ইউজিন গ্র। ফিলিপভ 4'19

হ্যাঁ আমি খেয়াল করিনি। আপনি উত্তরগুলিও দিয়েছেন।
ভানজিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.