在Python中将金额转换为Indian Notation

时间:2016-12-03 19:19:44

标签: python formatting currency

问题:我需要将金额转换为印度货币格式

我的代码:我有以下Python实施:

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()

我的问题:有没有办法让我的 currencyInIndiaFormat 功能更短,更简洁,更干净? /有没有更好的方法来编写我的 currencyInIndiaFormat 函数?

注意:我的问题主要基于Python实施上述问题。 这与以前提出的有关将货币转换为印度格式的问题不重复。

印度货币格式:

例如,此处的数字表示为:

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

参考Indian Numbering System

8 个答案:

答案 0 :(得分:6)

工作太多了。

>>> 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

答案 1 :(得分:2)

您可以按照以下步骤。 从pip安装Babel python软件包

pip install Babel

在您的python脚本中

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

输出:

₹ 54,33,422.80

答案 2 :(得分:1)

def format_indian(t):
dic = {
    4:'Thousand',
    5:'Lakh',
    6:'Lakh',
    7:'Crore',
    8:'Crore',
    9:'Arab'
}
y = 10
len_of_number = len(str(t))
save = t
z=y
while(t!=0):
   t=int(t/y)
   z*=10

zeros = len(str(z)) - 3
if zeros>3:
    if zeros%2!=0:
        string = str(save)+": "+str(save/(z/100))[0:4]+" "+dic[zeros]
    else:   
        string = str(save)+": "+str(save/(z/1000))[0:4]+" "+dic[zeros]
    return string
return str(save)+": "+str(save)

此代码将以最简单的方式将Yout编号转换为Lakhs,Crore和arabs。希望对您有所帮助。

for i in [1.234567899 * 10**x for x in range(9)]:
print(format_indian(int(i)))

输出:

1: 1
12: 12
123: 123
1234: 1234
12345: 12.3 Thousand
123456: 1.23 Lakh
1234567: 12.3 Lakh
12345678: 1.23 Crore
123456789: 12.3 Crore

答案 3 :(得分:0)

无法让其他两个解决方案适合我,所以我做了一些更低技术的东西:

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

这不适用于小数。如果你需要,我建议将小数部分保存到另一个变量中并在最后添加回来。

答案 4 :(得分:0)

这是另一种方法:

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'))

输出将是:

10,000,00,00,000.54 

(如Wikipedia印度编号系统中所述:Ex 67,89,000,00,00,000)

答案 5 :(得分:0)

<块引用>

另一种方式:

def formatted_int(value):
    # if the value is 100, 10, 1

    if len(str(value)) <= 3:
        return value

    # if the value is 10,000, 1,000
    elif  3 < len(str(value)) <= 5:
        return f'{str(value)[:-3]},{str(value)[-3:]} ₹'

    # if the value is greater the 10,000    
    else:
        cut = str(value)[:-3]  
        o = []
        while cut:
            o.append(cut[-2:]) # appending from 1000th value(right to left)
            cut = cut[:-2]
        
        o = o[::-1] # reversing list
        res = ",".join(o) 
        
        return f'{res},{str(value)[-3:]} ₹'


value1 = 1_00_00_00_000
value2 = 10_00_00_00_000          
value3 = 100

print(formatted_int(value1))
print(formatted_int(value2))
print(formatted_int(value3))
<块引用>

输出:

    1,00,00,00,000 ₹

    10,00,00,00,000 ₹

    100 ₹        

答案 6 :(得分:0)

def formatINR(number):
    s, *d = str(number).partition(".")
    r = ",".join([s[x-2:x] for x in range(-3, -len(s), -2)][::-1] + [s[-3:]])
    return "".join([r] + d)

使用起来很简单:

print(formatINR(123456))

输出

1,23,456

答案 7 :(得分:-1)

num=123456789
snum=str(num)
slen=len(snum)
result=''

if (slen-3)%2 !=0 :
    snum='x'+snum

for i in range(0,slen-3,2):
    result=result+snum[i:i+2]+','
    
result+=snum[slen-3:]
print(result.replace('x',''))