Python中的货币格式,但保留为数字

时间:2018-02-07 14:10:04

标签: python formatting

我想知道是否可以通过简单的方式将数字格式化为货币,以下问题对我有很大帮助:Currency Formatting in Python

我做到了,并且工作得很好。但它在字符串中转换了我的数据,这不是我想要的。

假设我想将pd.Series中的所有项目相加以返回总金额:它将返回所有数据的字符串连接,而不是数字。

如何将我的值转换回数字,但格式化?有可能吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

如果您想坚持使用pandas风格,假设您最初有一个名为pd.Series的{​​{1}},其中包含所有价格(浮动值),那么您可以创建一个prices浮点值和您使用pd.DataFrame包提到的prettyprint值。

locale

您可以从中轻松计算所需的聚合,但可以在另一列中访问漂亮的打印版本(字符串)。

import locale
locale.setlocale( locale.LC_ALL, '' )
prices = pd.Series([123,4321,12.4])
df = pd.DataFrame(prices, columns=['price'])
df['price_pretty'] = df['price'].apply(locale.currency)

>>> df
    price   price_pretty
0   123.0   Fr. 123,00
1   4321.0  Fr. 4321,00
2   12.4    Fr. 12,40

答案 1 :(得分:1)

处理此问题的一种方法是创建一个新类,为您处理表示的格式。通常,我只是将float子类化,但它看起来像pandas识别浮点数并转换为内置表示。因此,在这种情况下,您需要从头开始创建一个对象。

import pandas as pd
from numbers import Number


class Currency:
    def __init__(self, x):
        self.x = x
    def __repr__(self):
        return '${:,.2f}'.format(self.x)
    def __str__(self):
        return self.__repr__()
    def __add__(self, other):
        if isinstance(other, Currency):
            return Currency(self.x + other.x)
        elif isinstance(other, Number):
            return Currency(self.x + other)
        else:
            return NotImplemented
    def __radd__(self, other):
        return self + other

df = pd.DataFrame({'item': ['banana', 'laptop', 'gold brick'], 
                   'cost':[0.25, 1299.99, 1210000]})

df.cost = df.cost.apply(Currency)
df
# returns:
            cost        item
0          $0.25      banana
1      $1,299.99      laptop
2  $1,210,000.00  gold brick

df.cost.sum()
# returns:
$1,211,300.24

答案 2 :(得分:0)

你可以制作一个包装你的数字的课程。如果你为一个货币创建了一个类,你可以覆盖该类的一些基本函数,使其表现得像普通算术一样。请参阅link

例如:

class Currency(object):
    #other stuff
    def __add__(self,other):
        summed_value = self.value + other.value
        return Currency(self.type,summed_value)

这会让您将您的值设置为具有给定类型($,£等)的货币,但是您可以将这些值视为正常数字。

如果您觉得有兴趣可以添加类型检查或货币转换来处理某些值是一种货币但其他货币不是的情况!