1. 程式人生 > >類練習題1:將浮點數轉化為金額的類

類練習題1:將浮點數轉化為金額的類

注:該練習題來自(Python 核心程式設計 第二版)第13章 練習題13-3,題目如下:

13-3.對類進行定製,寫一個類,用來將浮點型值轉化為金額,在本練習裡,我們使用美國貨幣,但讀者也可以自選任意貨幣。

基本任務:編寫一個dollarize()函式,它以一個浮點型值作為輸入,返回一個字串形式的金額數。比如說:

dollarize(1234567.8901) ﹦﹥ ‘$1,234,567.89’

dollarize()返回的金額數裡應該允許有逗號(比如1,000,000)和美元的貨幣符號。如果有負號,它必須出現在美元符號的左邊。完成這項工作後,你就可以把它轉換成一個有用的類,名為MoneyFmt。

MoneyFmt類裡只有一個數據值(即金額),和5個方法(你可以隨意編寫其他方法)。__init__()構造器對資料進行初始化,update()方法把資料值替換成一個新值,__nonzero__() 是布林型的,當資料值非零時返回True,__repr__()方法以浮點型的形式返回金額,而__str__()方法採用和dollarize()一樣的字元格式顯示該值。

(a) 編寫update()方法,以實現資料值的修改功能。

(b) 以你已經編寫的dollarize()的程式碼為基礎,編寫__str__()方法的程式碼。

(c) 糾正__nonzero__()方法中的錯誤,這個錯誤以為所有小於1的數值,例如:50美分($0.50),返回假值(False)。

(d)附加題:允許使用者通過一個可選的引數指定是把負數數值顯示在一對尖括號裡還是顯示一個負號。預設引數是使用標準的負號。

下面是我寫的該例題程式碼,供以後參考:

#!/usr/bin/env python
 
class MoneyFmt(object):
    def __init__(self, money, mark=False):
        self.__money = money
        self.__mark = mark
 
    def __str__(self):
        return str(self.__dollarize())
     
    def __repr__(self):
        return '%s' % self.__money
     
    def __nonzero__(self):
        return bool(self.__money)
         
    def update(self, new_money):
        self.__money = new_money
 
    def __dollarize(self):
        if "-" not in str(self.__money):
            li = list(str(self.__money).split('.')[0])
        else:
            li = list(str(self.__money).split('.')[0])[1:]
        if len(li) <= 3:
            if "-" not in str(self.__money):
                return "$%.2f" % self.__money
            else:
                if self.__mark == False:
                    return "-$%.2f" % abs(self.__money)
                elif self.__mark == True:
                    return "<->$%.2f" % abs(self.__money)
        else:
            rev = "%.2f" % self.__money
            if "-" not in rev:
                li = list(rev.split('.')[0])
            else:
                li = list(rev.split('.')[0])[1:]
            length = len(li)
            x = divmod(length, 3)
            if x[1] != 0:
                count = x[0]
            else:
                count = x[0]-1
     
            i = 1
            while i <= count:
                li.insert((length-3), ',')
                i += 1
                length -= 3
     
            if "-" not in rev:
                string = "$" + ''.join(li) + rev[-3:]
            else:
                if self.__mark == False:
                    string = "-$" + ''.join(li) + rev[-3:]
                elif self.__mark == True:
                    string = "<->$" + ''.join(li) + rev[-3:]
            return string
 
def _test():
    x = MoneyFmt(123456.789)
    y = MoneyFmt(0.5)
    z = MoneyFmt(-123)
    m = MoneyFmt(-123.456,mark=True)
     
    print x
    print y
    print z
    print m
 
 
if __name__ == "__main__":
    _test()
該程式可當做模組匯入使用,也可直接執行,直接執行結果如下:

$123,456.79

$0.50

-$123.00

<->$123.46