【问题标题】:python: how to convert currency to decimal?python:如何将货币转换为十进制?
【发布时间】:2010-10-08 03:22:12
【问题描述】:

我在一个字符串变量中有美元

dollars = '$5.99'

如何将其转换为小数而不是字符串,以便可以对其进行操作,例如向其添加美元?

【问题讨论】:

    标签: python


    【解决方案1】:

    如果您只喜欢整数美分:

    cents_int = int(round(float(dollars.strip('$'))*100))
    

    如果你想要一个小数,只需使用...

    from decimal import Decimal
    dollars_dec = Decimal(dollars.strip('$'))
    

    如果您知道美元符号将一直存在,您可以使用dollars[1:] 代替dollars.strip('$'),但使用strip() 还可以处理省略美元符号的字符串(5.99 而不是@987654327 @)。

    【讨论】:

    • 如果您喜欢整数美分,请始终保持整数:d, c = dollars.strip('$').split('.', 2); cents = int(d) * 100 + int(c.strip()[:2])。当然,这假设您想将分数舍入为 0(在此处插入超人 III 的笑话)。
    • 小数选项是可以选择的。我会开 2 美分的玩笑,但已经晚了。
    【解决方案2】:

    假设存储在变量dollars 中的字符串是使用python 的语言环境模块生成的。将其转换回浮点数(十进制)的一种可能更简洁的方法是使用同一模块中的 atof 函数。只要您在两个方向(从货币到字符串,反之亦然)使用相同的 setlocale 参数,它就应该可以工作。

    例如:

    import locale
    locale.setlocale(locale.LC_ALL, '')
    value = 122445.56
    value_s = locale.currency(value, grouping=True)
    #generates $122,445.56
    

    将其转换回来:

    value2 = locale.atof(value_s[1:])
    #value2 = 122445.56 
    value == value2 #True
    

    【讨论】:

    • 这是考虑逗号作为千位分隔符的可能性的唯一答案,但它也会转换为浮点数而不是导致精度损失的小数。
    【解决方案3】:

    有一个简单的方法:

    dollar_dec = float(dollars[1:])
    

    【讨论】:

    • 将货币存储为浮点数通常是个坏主意。您可能会失去精度并使数据很容易暴露于舍入错误。现在,如果您想从超人 III 中获得一些额外的钱,并将其汇入您拥有的附属账户......
    • 又名办公空间;如果你幸运的话,你最终不会不得不烧毁建筑物。
    【解决方案4】:

    如果你想使用十进制:

    from decimal import Decimal
    dollars = Decimal(dollars.strip('$'))
    

    从那里添加非常简单

    dollars += 1 # Would add 1 to your decimal
    

    【讨论】:

      【解决方案5】:

      我知道这是一个老问题,但这是解决您的问题的一种非常简单且易于阅读的方法:

      为:

      dollars = '$5.99'
      dollars = dollars.replace("$","").replace(",","")
      /* 5.99 */
      

      它也适用于可能包含逗号的较大数字:

      dollars = '1,425,232.99'
      dollars = dollars.replace("$","").replace(",","")
      /* 1425232.99 */
      

      【讨论】:

      • 最后仍然是一个字符串。
      • 以...结尾...美元 = 浮动(美元)...你很好
      【解决方案6】:

      通过十进制包

      >>> dollars = '$5.99'
      >>> import decimal
      >>> decimal.Decimal(dollars[1:])
      Decimal('5.99')
      >>> 
      

      【讨论】:

        【解决方案7】:

        如果您只打算进行加法(而不是乘法或除法),请考虑只存储美分而不是美元,而不是使用小数包。我建议使用最简单的工具来完成这项工作,如果您只是添加美元和美分,十进制不会提供任何价值。

        【讨论】:

          【解决方案8】:

          首先,去掉“$”字符。如果它始终是第一个字符,那很容易:

          dollars[1:]
          

          为了保持美分完美而不用担心浮点中美分的不完美表示,您需要使用 Decimal 值:

          from decimal import *
          Decimal(dollars[1:])
          

          【讨论】:

            【解决方案9】:

            如果您想将钱以美分表示以便于四舍五入,但有时会缺少“$”:

            for dollars in ('$5.99','6.77'):
                cents = int(float((dollars[1:] if dollars.startswith('$') else dollars))*100)
                print '%s = %i cents = %i dollars and %i cents' % ((dollars, cents)+divmod(cents, 100))
            

            【讨论】:

              【解决方案10】:

              这是另一个将杂乱的货币字符串转换为四舍五入到美分的小数的示例:

              from decimal import Decimal, ROUND_DOWN
              
              messy = ',   $1, 111.2199  ,,,'
              
              less_messy = Decimal(''.join(messy.replace(',','').split()).replace('$',''))
              converted = less_messy.quantize(Decimal(".01"), rounding=ROUND_DOWN)
              
              print(converted)
              1111.21
              

              其他舍入选项包括:ROUND_HALF_UP、ROUND_HALF_DOWN、ROUND_UP

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-12-19
                • 2011-09-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多