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应用程序中,这些图标的显示都要随列 ...
随机推荐
- 【HNOI2015】落忆枫音
题面 题解 求一个有特殊性质的有向图的生成树的个数. 首先,有向图的生成树的个数可以用矩阵树定理,能够得到\(40\)分. 但是如果它是一个\(\mathrm{DAG}\)就很好做,枚举每一个点的父亲 ...
- idea web项目debug模式实时更新按钮不生效原因
必须两个都开启才能生效,单按按钮不能生效,但是有时候自动更新不生效的时候按按钮后可以生效, 如果前端目录或后端内容实在不更新,就删掉out目录和target目录,重新启动服务器即可
- vue复习(二)
一.组件介绍 每一个组件都是一个vue实例 每个组件均具有自身的模板template,根组件的模板就是挂载点 每个组件模板只能拥有一个根标签 子组件的数据具有作用域,以达到组件的复用 二.局部组件 & ...
- 部署asp.net MVC 4项目到iis
详细步骤如下: 1.安装WIN7的IIS功能 步骤: 控制面板->程序与功能->打开和关闭Windows功能,配置如下图所示[在Internet信息服务路径下勾选所需的就行,全部勾上也行. ...
- SICP读书笔记 2.2
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- Netty源码分析第3章(客户端接入流程)---->第3节: NioSocketChannel的创建
Netty源码分析第三章: 客户端接入流程 第三节: NioSocketChannel的创建 回到上一小节的read()方法: public void read() { //必须是NioEventLo ...
- Flink BLOB架构
Flink中支持的BLOB文件类型 jar包 被user classloader使用的jar包 高负荷RPC消息 1. RPC消息长度超出了akka.framesize的大小 2. 在HA摸式中,利用 ...
- 拒绝滥用golang defer机制
原文链接 : http://www.bugclosed.com/post/17 defer机制 go语言中的defer提供了在函数返回前执行操作的机制,在需要资源回收的场景非常方便易用(比如文件关闭, ...
- import 导入包的特别用法总结
指定别名 可以为包指定一个别名,以便记忆或提高输入效率 如 import str "strings" 在使用的时候可以直接使用别名,如原先要写成strings.Contains,现 ...
- yarn资源memory与core计算配置
yarn调度分配主要是针对Memory与CPU进行管理分配,并将其组合抽象成container来管理计算使用 memory配置 计算每台机子最多可以拥有多少个container: container ...