Convert an amount to Indian Notation in Python

别等时光非礼了梦想. 提交于 2019-12-01 01:14:06

问题


Problem: I need to convert an amount to Indian currency format

My code: I have the following Python implementation:

import decimal
def currencyInIndiaFormat(n):
  d = decimal.Decimal(str(n))
  if d.as_tuple().exponent < -2:
    s = str(n)
  else:
    s = '{0:.2f}'.format(n)
  l = len(s)
  i = l-1;
  res = ''
  flag = 0
  k = 0
  while i>=0:
    if flag==0:
      res = res + s[i]
      if s[i]=='.':
        flag = 1
    elif flag==1:
      k = k + 1
      res = res + s[i]
      if k==3 and i-1>=0:
        res = res + ','
        flag = 2
        k = 0
    else:
      k = k + 1
      res = res + s[i]
      if k==2 and i-1>=0:
        res = res + ','
        flag = 2
        k = 0
    i = i - 1

  return res[::-1]

def main():
  n = 100.52
  print "INR " + currencyInIndiaFormat(n)  # INR 100.52
  n = 1000.108
  print "INR " + currencyInIndiaFormat(n)  # INR 1,000.108
  n = 1200000
  print "INR " + currencyInIndiaFormat(n)  # INR 12,00,000.00

main()

My Question: Is there a way to make my currencyInIndiaFormat function shorter, more concise and clean ? / Is there a better way to write my currencyInIndiaFormat function ?

Note: My question is mainly based on Python implementation of the above stated problem. It is not a duplicate of previously asked questions regarding conversion of currency to Indian format.

Indian Currency Format:

For example, numbers here are represented as:

1
10
100
1,000
10,000
1,00,000
10,00,000
1,00,00,000
10,00,00,000

Refer Indian Numbering System


回答1:


Too much work.

>>> import locale
>>> locale.setlocale(locale.LC_MONETARY, 'en_IN')
'en_IN'
>>> print locale.currency(100.52, grouping=True)
₹ 100.52
>>> print locale.currency(1000.108, grouping=True)
₹ 1,000.11
>>> print locale.currency(1200000, grouping=True)
₹ 12,00,000.00



回答2:


You can follow these steps. Install Babel python package from pip

pip install Babel

In your python script

from babel.numbers import format_currency
format_currency(5433422.8012, 'INR', locale='en_IN')

Output:

₹ 54,33,422.80



回答3:


Couldn't make the other two solutions work for me, so I made something a little more low-tech:

def format_as_indian(input):
    input_list = list(str(input))
    if len(input_list) <= 1:
        formatted_input = input
    else:
        first_number = input_list.pop(0)
        last_number = input_list.pop()
        formatted_input = first_number + (
            (''.join(l + ',' * (n % 2 == 1) for n, l in enumerate(reversed(input_list)))[::-1] + last_number)
        )

        if len(input_list) % 2 == 0:
            formatted_input.lstrip(',')

    return formatted_input

This doesn't work with decimals. If you need that, I would suggest saving the decimal portion into another variable and adding it back in at the end.




回答4:


Here is the other way around:

import re
def in_for(value):
    value,b=str(value),''
    value=''.join(map(lambda va:va if re.match(r'[0-9,.]',va) else '',value))
    val=value
    if val.count(',')==0:
        v,c,a,cc,ii=val,0,[3,2,2],0,0
        val=val[:val.rfind('.')] if val.rfind('.')>=0  else val
        for i in val[::-1]:
            if c==ii and c!=0:
                ii+=a[cc%3]
                b=','+i+b
                cc+=1  
            else:
                b=i+b
            c+=1
        b=b[1:] if b[0]==',' else b
        val=b+v[value.rfind('.'):]  if value.rfind('.')>=0  else b
    else:
        val=str(val).strip('()').replace(' ','')
    v=val.rfind('.')
    if v>0:
        val=val[:v+3]
    return val.rstrip('0').rstrip('.') if '.' in val else val

print(in_for('1000000000000.5445'))

Output will be:

10,000,00,00,000.54 

(As mentioned in wikipedia indian number system Ex:67,89,000,00,00,000)



来源:https://stackoverflow.com/questions/40951552/convert-an-amount-to-indian-notation-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!