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应用程序中,这些图标的显示都要随列 ...
随机推荐
- 20155237 2016-2017-2 《Java程序设计》第1周学习总结
20155237 2016-2017-2 <Java程序设计>第一周学习总结 一.认真学习考核方式,理解成绩构成 考核方式 首先由100分构成:课堂考核12次,实验5次,团队项目(每周进度 ...
- 20155214 2016-2017-2 《Java程序设计》第10周学习总结
学号 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 掌握Java Socket编程 理解混合密码系统 掌握Java 密码技术相关API的使用 教材学习中的 ...
- 自己写个activex控件,如何知道他的classid(转载)
在网页里用的时候需要知道他的classid我在代码中看到有 const GUID CDECL BASED_CODE _tlid = { 0x89201950, 0x2CAC, 0x4CF7, { 0x ...
- PostgreSQL PITR实验
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 看PostgreSQL中与PITR相关的设定 ...
- Tomcat部署Web应用
在Tomcat中部署Web有三种方法: 1,可以将Web应用文件直接复制到webapps目录下,也可以将Web应用打成war包放到webapps目录下,tomcat会自动解开war包,并在webapp ...
- Tomcat 基础
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...
- Git积累
1.使用git config命令进行配置(此配置为全局配置,这些是在提交commit时的签名): $ git config --global user.name "填写github的用户名& ...
- Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)
elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介.Java REST Client.Java Client.Spri ...
- Git----02本地仓库进行文件添加&修改&删除&查看
一.将新文件上传到本地仓库----使用小乌龟工具 1.1.将文件添加到暂存区 进入仓库目录,创建文件,添加暂存区 1.2.将文件添加到本地仓库 选中已经添加到暂存区的文件,进行提交 二.查看本 ...
- 纯命令行界面下安装并运行官方Android emulator
纯命令行界面指没有安装Android studio. 下载sdk-tools 可以根据实际需要下载,不需要FQ(2018-04-07) 下载后只有一个tools目录. 平台 SDK 工具包 大小 SH ...