prePEP:货币数据类型 [英] prePEP: Money data type
问题描述
我发送给它。
建议和各种推荐不仅仅是欢迎。
如果一切顺利,那就是它当我写完代码后,我将成为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屋!