将金额转换为 Python 中的印度表示法

问题描述 投票:0回答:11

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

我的代码:我有以下

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

参考印度编号系统

python formatting currency
11个回答
28
投票

工作量太大。

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

17
投票

简单版:

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

如果你想处理负数和字符串,

def formatINR(number):
    number = float(number)
    number = round(number,2)
    is_negative = number < 0
    number = abs(number)
    s, *d = str(number).partition(".")
    r = ",".join([s[x-2:x] for x in range(-3, -len(s), -2)][::-1] + [s[-3:]])
    value = "".join([r] + d)
    if is_negative:
       value = '-' + value
    return '₹'+ value

样品:

print(formatINR('-004.256'))

输出:

₹-4.26

15
投票

您可以按照以下步骤操作。 从 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

3
投票

注意 - 这是实际问题的替代解决方案

如果有人尝试将

K
L
Cr
等简单的印度术语转换为 2 个浮点值,则以下解决方案可行。

def format_cash(amount):
    def truncate_float(number, places):
        return int(number * (10 ** places)) / 10 ** places

    if amount < 1e3:
        return amount

    if 1e3 <= amount < 1e5:
        return str(truncate_float((amount / 1e5) * 100, 2)) + " K"

    if 1e5 <= amount < 1e7:
        return str(truncate_float((amount / 1e7) * 100, 2)) + " L"

    if amount > 1e7:
        return str(truncate_float(amount / 1e7, 2)) + " Cr"

示例

format_cash(7843) --> '7.84 K'
format_cash(78436) --> '78.43 K'
format_cash(784367) --> '7.84 L'
format_cash(7843678) --> '78.43 L'
format_cash(78436789) --> '7.84 Cr'

1
投票

这是相反的方式:

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 

(如维基百科印度数字系统中所述,例如:67,89,000,00,00,000)


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)

此代码将以最简单的方式将您的数字转换为十万、千万和阿拉伯。希望有帮助。

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

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 ₹        

0
投票

作为 pgksunilkumar 的回答,如果数字在 0 到 -1000 之间,则进行了一些改进

def formatINR(number):
    if number < 0 and number > -1000:
        return number
    else:
        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)

现在如果数字在0到-1000之间,格式不会打扰用户。

a = -600
b = -10000000
c = 700
d = 8000000

print(formatINR(a))
print(formatINR(b))
print(formatINR(c))
print(formatINR(d))

输出将是:

-600
-1,00,00,000
700
80,00,000

0
投票

那些需要在 Jupyter Notebook 中使用 Pandas float_format 的人,

import locale
locale.setlocale(locale.LC_MONETARY, 'en_IN')

pd.options.display.float_format = lambda x : locale.currency(x, grouping=True)

-1
投票

无法让其他两个解决方案为我工作,所以我做了一些技术含量较低的东西:

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

这不适用于小数。如果您需要,我建议将小数部分保存到另一个变量中,然后将其添加回末尾。


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


    
    
© www.soinside.com 2019 - 2024. All rights reserved.