用了这些年的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类型。

 

四.       参考文献

  1. Delphi中对BCD码的直接支持 .

http://www.cnblogs.com/ywangzi/archive/2012/11/14/2769823.html

转自: https://www.cnblogs.com/lrl45/p/5135460.html

Delphi中BCD和Currency类型的更多相关文章

  1. delphi中的各种文件类型介绍【转】

    1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...

  2. delphi中的各种文件类型介绍

    1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...

  3. delphi中如何将string类型的字符串数据转化成byte[]字节数组类型的数据

    var  S:String;  P:PChar;  B:array of Byte;begin  S:='Hello';  SetLength(B,Length(S)+1);  P:=PChar(S) ...

  4. delphi中formatFloat代码初探(在qt下实现floatformat的函数)

    由于项目需要,需要在qt下实现floatformat的函数.之前写过一个,但是写得不好.决定重新写一个,参考delphi xe2下的实现.把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来. ...

  5. Delphi中对BCD码的直接支持 (转)

    最近在Delphi下写软件,需要将数据转换为BCD码和将BCD码转换为其它数据类型,从网上搜索了一下,没有发现好的函数,于是就想自定义函数来完成BCD与其它格式的数据转换功能.但最终没有动手写,先查查 ...

  6. Delphi中String类型原理介绍

    Delphi中字符串的操作很简单,但幕后情况却相当复杂.Pascal传统的字符串操作方法与Windows不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型,该类型 ...

  7. 关于MySQL的TinyInt数据类型在Delphi中作为Boolean类型的一个要注意的问题

    关于MySQL的TinyInt数据类型在Delphi中作为Boolean类型的一个要注意的问题: 在定义TinyInt类型字段时,若要作为Delphi中作为Boolean类型,则该字段的长度必须为1!

  8. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的

    bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...

  9. 在Delphi中使用系统对应文件类型的图标

    在应用程序的编写中,组合框(ComboBox).列表框(ListBox).等常见的部件,通常不仅要用于显示文字,而且还要显示其与文字相关的图标.在一般的Windows应用程序中,这些图标的显示都要随列 ...

随机推荐

  1. AGC 007 D - Shik and Game

    D - Shik and Game 链接 题意: 数轴上有一个人,从0出发到E,速度为1.数轴上还有n只熊,每只熊会在经过后的T时刻后产生一个金币.给定E,T以及n个熊的坐标pi,求收集完所有金币并到 ...

  2. [NOI2016]区间 线段树

    [NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...

  3. 洛咕P3250 [HNOI2016]网络 整体二分

    这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...

  4. Dbzoj#3188. [Coci 2011]Upit

    写道数据结构练练手哈哈哈 // It is made by XZZ #include<cstdio> #include<algorithm> #include<cstdl ...

  5. 2018年美国大学生数学建模竞赛(MCM/ICM) B题解题思路

    老套路,把我们在解决B题时候采用的思路分享给大家,希望大家能学到点东西~~~ B题思路整理:Part1:先整理出说某种语言多的十个国家给找出来,或者说是把十种语言对应的国家找出来 然后再对各个国家的人 ...

  6. [PLC]ST语言三:OUT/OUT_T/OUT_C/OUT_C-C32

    一:OUT/OUT_T/OUT_C/OUT_C-C32               说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言: (*OUT(EN,D);*) ...

  7. Jenkins持续部署

    Jenkins持续部署 Jenkins提供很好的连续部署和交付的支持.看一下部署任何软件开发的流程,将如下图所示. 连续部署的主要部分,是确保其上面所示的整个过程是自动化的.Jenkins实现所有这些 ...

  8. 高级PHP工程师所应该具备的专业素养

    初次接触PHP,就为他的美所折服,于是一发不可收拾. 很多面试,很多人员能力要求都有“PHP高级工程师的字眼”,如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师所应该具备的,希望 ...

  9. SQL Server 各版本安装包分享

    已将SQL Server 2005以上各版本的安装包分享到百度云盘,有需要的朋友可以下载进行安装,相关安装教程可以百度搜索.安装遇到难以解决的问题可以留言给我,2016版以上在选择功能的时候建议初学者 ...

  10. SSH免密登录(并且免yes交互)

    问题描述:主机A使用ssh协议远程主机B,默认会开启口令认证,即输入主机B对应用户的登录密码,并且第一次登录时,主机A需验证是否接受来自主机B的公钥,输入"yes/no"完成交互. ...