prePEP:货币数据类型 [英] prePEP: Money data type

查看:47
本文介绍了prePEP:货币数据类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发送给它。


建议和各种推荐不仅仅是欢迎。


如果一切顺利,那就是它当我写完代码后,我将成为PEP。


谢谢。


.. Facundo

------------------------------------------------- -----------------------


PEP:XXXX

标题:货币数据类型

版本:$修订版:0.1 $

最后修改日期:$ Date:2003/10/17 17:34:00 $

作者:Facundo Batista< fb ****** @ unifon.com.ar>

状态:草稿

类型:标准追踪

内容类型:text / x-rst

创建时间:2003年10月17日

Python版本:2.3.3

摘要< br $>
========


我的想法是创建一个Money数据类型,主要用于财务用途,其中

需要小数,但浮点数太不精确。 Money数据类型

应该支持Python标准函数和操作。

基本原理

=========

requeriments的详细信息在`Requirements`_部分。这里

我会

包括所做的所有决定和原因,以及所有主题仍然在讨论
。这些要求将被编号,以简化对每一点

的讨论。


作为XP练习,我会在课前编写测试用例,所以

它'

完全符合这些测试的要求。请查看它们

确切

规范(如果您提出不同的行为,请尽可能提出

相应的测试用例,谢谢)。

为什么不使用Tim Peters的'FixedPoint?

---------------------- ----------------


正如我们在Requeriments中看到的那样,thera是FixedPoint不符合的项目

(因为不做某事或做不同的事)。它可以扩展



修改以符合Requeriments,但有些需求属于货币,而

FixedPoint的一些功能也是如此很多钱,所以拿出来将

使这个类更简单。


无论如何,有时可能有一个可以成为另一个的子类,或者只是制作

来自两者。 Money类的代码在很大程度上基于Tim Peters'NeedPoint的

代码:谢谢你(非常)有价值的想法。

讨论中的项目

-------------------


6.关于repr()。应该``myMoney == eval(repr(myMoney))``?

要求

============


1. sintaxis应该是``Money(value,[precision])``。


2.值类型可以是:


- 另外一笔钱(如果你不包含*精度*,它会继承

继承)


- int或者长(默认*精度*:0)::


钱(45):45

钱(45,2):45.00

Money(5000000000,3):5000000000.000

- 浮动(*精度*必须包括在内)::


Money( 50.33,3):50.330

- 字符串(*精度*从字符串中提取)::


Money('''25.32' '):25.32

Money(''25.32'',4):25.3200


- 可以被long()或float()强制转换的东西


3.不支持带工程符号的字符串(

使用钱时你不需要这个)。


4.精度必须是在负整数上,在创建对象后,你无法改变它。


5.属性``decimalSeparator``,``currencySymbol``和

``千位分离器``可能会重载,只是为了方便更改它们

子类化。这个* decimalSeparator *是接收字符串时构造函数

使用的* decimalSeparator *。默认值为::


decimalSeparator =''。''

currencySimbol =''$''

thousandSeparator ='' ''


6.调用repr()不应该返回str(self),因为如果子类

表示``decimalSeparator ='''' ``,这可能会造成混乱。

所以,repr()应该显示三个值的元组:IntPart,FracPart,

精确。


7.遵守Mark McEahern的测试案例::


成本=金钱(''5.99'')

percentDiscount = 10

个月= 3

subTotal =成本*个月

discount = subTotal *(percentDiscount * 1.0)/ 100

total = subTotal - discount

assertEqual(total,Money(''16.17''))


8.支持基本的aritmetic(` `+, - ,*,/,//,**,%,divmod``)和



比较(``==,!=,< ;,>,< =,> =,cmp``)在以下情况下:


- Money op Money

- Money op otherType

- otherType op Money

- Money op = otherType


OtherType可以是int,float或long。 Automaticlly将转换为

Money,继承

操作的其他组件的精度(并且,在浮动的情况下,可能会失去精度

**之前**

操作)。


当两者都是Moneys时,结果具有更大的精度。


9.支持一元运算符(`` - ,+,abs``)。


10.支持内置方法:


- 分钟,最大值

- 浮点数,整数,长数(int和long由Money舍入)

- str,repr

- 哈希

- 复制,深度复制

- bool(0为假,否则为真)


11.拥有返回其组件的方法。 Money的价值将是

``(int part)+(frac part)/(10 ** precision)``。


- `` getPrecision()``:精度

- ``getFracPart()``:小数部分(长)

- ``getIntPart()``: int part(as long)


12.四舍五入为财务。这意味着要在

位置舍入一个数字,如果该位置右侧的数字大于5,则该位置左侧的数字为
增加1,如果它是小于5的b $ b不是::


1.123 - > 1.12

1.128 - > 1.13


但当该位置右侧的数字为== 5时。在那里,如果那个位置左边的

数字是奇数,它会增加,

否则

isn''t ::


1.125 - > 1.12

1.135 - > 1.14

参考实施

========================

稍后加入:


- 代码

- 测试代码

- 文档

版权

=========


本文档已被置于公共领域。

推荐答案

修订版:0.1




Last-Modified:

Last-Modified:


日期:2003/10/17 17:34:00
Date: 2003/10/17 17:34:00


这篇关于prePEP:货币数据类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆