Delphi中BCD和Currency类型
用了这些年的Delphi,竟然对Currency及TBCDField一知半解,下文给了很好的讲解,值得一读。
一. BCD类型
BCD即Binary-Coded Decimal?,在Delphi中,BCD字段类型可以精确保存浮点数据类型。
Delphi支持的BCD码的数据类型名为TBCD,它的定义如下:
|
TBcd = packed record Precision: Byte; { 1..64 } SignSpecialPlaces: Byte; { Sign:1, Special:1, Places:6 } Fraction: packed array [0..31] of Byte; { BCD Nibbles, 00..99 per Byte, high Nibble 1st } end; |
对BCD的支持是在FMTBcd单元中,所以要使用BCD函数,则需要引用此单元。
Delphi的BCD函数有:
|
BcdAdd |
计算两个BCD码的和 |
|
BcdCompare |
比较两个BCD的大小 |
|
BcdDivide |
BCD数据相除 |
|
BcdMultiply |
BCD数据相乘 |
|
BcdPrecision |
返回BCD的数据个数。如BCD的123返回值为3,BCD值为9382时返回值为4。 |
|
BcdScale |
返回BCD码的小数位数 |
|
BcdSubtract |
两个BCD码相减 |
|
BCDToCurr |
转换BCD码为Current格式的数据类型 |
|
BcdToDouble |
BCD码转换为Double格式的数据类型 |
|
BcdToInteger |
BCD码转换为Integer格式的数据类型 |
|
BcdToStr |
BCD码转换为字符串 |
|
BcdToStrF |
BCD码转换为带格式控制的字符串 |
|
CurrToBCD |
Current数据类型转换为BCD码 |
|
DoubleToBcd |
Double数据类型转换为BCD码 |
|
FormatBcd |
格式化BCD码为字符串 |
|
IntegerToBcd |
Integer整数类型转换为BCD码 |
|
IsBcdNegative |
判断BCD是否为负数 |
|
NormalizeBcd |
将一个BCD的值根据给定的精度和小数位数转换为另外一个BCD码的值 |
|
NullBcd |
判断BCD是否为NULL |
|
StrToBcd |
字符串转换为BCD码 |
|
TryStrToBcd |
字符串转换为BCD码,转换失败返回给定的默认值 |
二. Currency类型
和SQL SERVER中money类型一模一样,Delphi中Currency类型:
1) 占用8个字节。
2) 总是4位小数。
3) 范围为:-2^63 ~ 2^63-1(-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807)。存储格式相当于总是乘以10000,然后按整数格式保存。
三. BCD字段类型(TBCDField)
现在很多数据库中都有了Decimal和Numeric数据类型,它们可以精确保存浮点类型,可以将Decimal和Numeric类型映射为BCD字段类型。
在BDE的TDatabase控件,有一个EnableBCD选项:

在ADO的TADOQuery也有EnableBCD选项。

EnableBCD选项的用来说明如何处理数值类型(Decimal和Numeric)字段:
1) EnableBCD为TRUE时,数值类型字段映射为TBCDField类。
2) EnableBCD为FALSE时,数值类型字段映射为TFloatField类。
TBCDField定义在DB.pas文件中:
|
TBCDField = class(TNumericField) private FCurrency: Boolean; FCheckRange: Boolean; FMinValue: Currency; FMaxValue: Currency; FPrecision: Integer; procedure SetCurrency(Value: Boolean); procedure SetMaxValue(Value: Currency); procedure SetMinValue(Value: Currency); procedure SetPrecision(Value: Integer); procedure UpdateCheckRange; protected class procedure CheckTypeSize(Value: Integer); override; procedure CopyData(Source, Dest: Pointer); override; function GetAsBCD: TBcd; override; function GetAsCurrency: Currency; override; function GetAsFloat: Double; override; function GetAsInteger: Longint; override; function GetAsString: string; override; function GetAsVariant: Variant; override; function GetDataSize: Integer; override; function GetDefaultWidth: Integer; override; procedure GetText(var Text: string; DisplayText: Boolean); override; function GetValue(var Value: Currency): Boolean; procedure SetAsBCD(const Value: TBcd); override; procedure SetAsCurrency(Value: Currency); override; procedure SetAsFloat(Value: Double); override; procedure SetAsInteger(Value: Longint); override; procedure SetAsString(const Value: string); override; procedure SetVarValue(const Value: Variant); override; public constructor Create(AOwner: TComponent); override; property Value: Currency read GetAsCurrency write SetAsCurrency; published { Lowercase to avoid name clash with C++ Currency type } property currency: Boolean read FCurrency write SetCurrency default False; property MaxValue: Currency read FMaxValue write SetMaxValue; property MinValue: Currency read FMinValue write SetMinValue; property Precision: Integer read FPrecision write SetPrecision default 0; property Size default 4; end; |
因为TBCDField使用Currency类型来保存数据(注意:不是用TBCD来保存的),而Currency固定有且只有4位小数,所以精度超过4位请使用TFloatField(即EnableBCD位FALSE)。
* 精度太高如果使用TFloatField有时发现录入的小数保存后会发生变化,这时还可以选择使用TFMTBCDField来保存数据;
UniDAC可参考下图设置:
修改EnableFMTBCD属性后需将UniQuery打开刷新一次(双击Active属性2次),最后将字段删除再重新拉进来, 对应的字段就会变成TFMTBCDField类型。
四. 参考文献
- Delphi中对BCD码的直接支持 .
http://www.cnblogs.com/ywangzi/archive/2012/11/14/2769823.html
转自: https://www.cnblogs.com/lrl45/p/5135460.html
Delphi中BCD和Currency类型的更多相关文章
- delphi中的各种文件类型介绍【转】
1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...
- delphi中的各种文件类型介绍
1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...
- delphi中如何将string类型的字符串数据转化成byte[]字节数组类型的数据
var S:String; P:PChar; B:array of Byte;begin S:='Hello'; SetLength(B,Length(S)+1); P:=PChar(S) ...
- delphi中formatFloat代码初探(在qt下实现floatformat的函数)
由于项目需要,需要在qt下实现floatformat的函数.之前写过一个,但是写得不好.决定重新写一个,参考delphi xe2下的实现.把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来. ...
- Delphi中对BCD码的直接支持 (转)
最近在Delphi下写软件,需要将数据转换为BCD码和将BCD码转换为其它数据类型,从网上搜索了一下,没有发现好的函数,于是就想自定义函数来完成BCD与其它格式的数据转换功能.但最终没有动手写,先查查 ...
- Delphi中String类型原理介绍
Delphi中字符串的操作很简单,但幕后情况却相当复杂.Pascal传统的字符串操作方法与Windows不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型,该类型 ...
- 关于MySQL的TinyInt数据类型在Delphi中作为Boolean类型的一个要注意的问题
关于MySQL的TinyInt数据类型在Delphi中作为Boolean类型的一个要注意的问题: 在定义TinyInt类型字段时,若要作为Delphi中作为Boolean类型,则该字段的长度必须为1!
- Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的
bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...
- 在Delphi中使用系统对应文件类型的图标
在应用程序的编写中,组合框(ComboBox).列表框(ListBox).等常见的部件,通常不仅要用于显示文字,而且还要显示其与文字相关的图标.在一般的Windows应用程序中,这些图标的显示都要随列 ...
随机推荐
- OracleLinux安装说明
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackgao@gmail. ...
- QtCore Module's Classes
Qt Core C++ Classes Provides core non-GUI functionality. More... Reference These are links to the AP ...
- 6-[HTML]-标签属性
1.HTML标签属性 HTML标签可以设置属性,属性一般以键值对的方式写在开始标签中.如 <div id="i1">这是一个div标签</div> < ...
- 提交到开源git时出现:fatal: refusing to merge unrelated histories的解决办法
解决办法 创建本地库和fetch远程分支这些前面的步骤这里略过.可以自行百度. 解决办法: 1.cmd进入项目的根目录. 2.执行下面的命令:git pull origin master --al ...
- 使用SDNN (space displacement neural network)进行多字体手写识别
手写单字体的识别,在看过卷积神经网络的mnist例子之后,很容易实现,那么如何实现多字体的同时识别呢? 如下图 LeCun大神所用的是SDNN space displacement neural ne ...
- CS100.1x-lab1_word_count_student
这是CS100.1x第一个提交的有意义的作业,自己一遍做下来对PySpark的基本应用应该是可以掌握的.相关ipynb文件见我github. 这次作业的目的如题目一样--word count,作业分成 ...
- CSS中的height与line-height的区别
<p class='text'>高与行高的区别</p> 那么我要想让这些字上下居中那么可以用宽度和行高控制 .text{ height:25px; line-height:25 ...
- 使用web api开发微信公众号,调用图灵机器人接口(二)
此文将分两篇讲解,主要分为以下几步 签名校验; 首次提交验证申请; 接收消息; 被动响应消息(返回XML); 映射图灵消息及微信消息; 此篇为第二篇. 被动响应消息(返回XML) 上一篇中,我们已经可 ...
- Python语言简介以及特点
编程语言的分为编译型语言和解释型语言: 1. 编译型语言: (1) 编译型语言的代表:C.C++.Delphi等, (2) 编译型语言的运行方式:编译 -> 运行 (3) 编译型语言的优缺点分析 ...
- Jmeter接口测试(五)变量及参数化
在请求过程中,有时我们需要在请求中设置一些变量来测试不同的场景. 提示:在调试请求过程中,无关的请求可以暂时禁用掉,选择某个暂时不用的请求,右键--禁用 Jmeter 支持以下类型变量:所有类型的变量 ...