类练习题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

时间: 2024-11-03 01:16:43

类练习题1:将浮点数转化为金额的类的相关文章

JAVA 浮点数转化为百分数,分离整数和小数部分

JAVA 浮点数转化为百分数 public class DoubleToPercentformat { /** * 将double类型数据转换为百分比格式,并保留小数点前IntegerDigits位和小数点后FractionDigits位 * @param d * @param IntegerDigits * @param FractionDigits * @return */ public static String getPercentFormat(double d,int IntegerD

浮点数运算和金额处理

做一个用户中奖记录页面,展示每条记录和总金额,遇到浮点数相加出现问题. Js的浮点数在比较或者做运算的时候会不准确,这个只在初学js的时候读到过概念性的东西,这次就遇到了就在这里记一笔,做一下相关拓展,网上处理的方法也很多,这里摘要一些博主的. 浮点数运算: 转自:https://blog.csdn.net/u013347241/article/details/79210840 思路是将小数转成整数来运算,之后再转回小数. 'use strict' var accAdd = function(n

Timestame类型和String 类型的转化

Timestame类型和String 类型的转化 String转化为Timestamp: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = df.format(new Date());Timestamp ts = Timestamp.valueOf(time); Timestamp转化为String: SimpleDateFormat df = new SimpleDateFo

mysql 将指定列的浮点数转化为整数

mysql 将指定列的浮点数转化为整数: update A set B =  cast(B as decimal(10,0))  -- 或者 update A set B = round(B,0) 例如:update hdcloude01.t_a01_eltable set t_a01_eltable.BatteryDal =  round(t_a01_eltable.BatteryDal, 0) where t_a01_eltable.`BatteryDal`  is not null;

Objective-C浮点数转化整数(向上取整、向下取整)

Objective-C拓展了C,自然很多用法是和C一致的.比如浮点数转化成整数,就有以下四种情况. 1.简单粗暴,直接转化 float f = 1.5; int a; a = (int)f; NSLog("a = %d",a); 输出结果是1.(int)是强制类型转化,丢弃浮点数的小数部分. 2.高斯函数,向下取整 float f = 1.6; int a; a = floor(f); NSLog("a = %d",a); 输出结果是1.floor()方法是向下取整

面向切面编程AOP——加锁、cache、logging、trace、同步等这些较通用的操作,如果都写一个类,则每个用到这些功能的类使用多继承非常难看,AOP就是解决这个问题的

面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java中mybatis的@Transactional注解,大家知道被这个注解注释的函数立即就能获得DB的事务能力. 2)python中的with threading.Lock(),大家知道,被这个with代码块包裹的部分立即获得同步的锁机制. 这样我们把事务和加锁这两种与业务无关的逻辑抽象出来,在逻辑上解耦,并且可

Delphi线程类 DIY(把类指针作为参数传进去,就可以执行类里面的方法啦)

Delphi 封装了一个很强大的线程类 TThread, 我们也自己动手制作一个简单的线程类 首先Type一个类 [delphi] view plain copy type TwwThread = class constructor Create; overload; destructor Destroy; override; private m_hThread: THandle;     //线程 m_ThreadID : TThreadID; public procedure Execute

【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三】动手绑定自己定义类至Lua

查看[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之二]新建项目中配制环境,我们完美的在新建项目中完毕了绑定须要的环境,接下来才是最关健的一步.绑定自己定义C++类至Lua. 其实引擎为了方便我们应对不同平台,已经帮我们创建了不同平台的project项目. 为了编辑代码方便.我使用VS2013打开了"runtime-src"文件夹下的"proj.win32"project. 前往项文件夹径"F:\Cocos2dx-Lua\Garfie

(转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考

昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"<<endl; } virtual void printB() { cout<<"printB"<<endl; } }; main函数调用: D *d=NULL; d->printA(); d->printB(); 输出结果是? 当时想的是对象d直