BCD and currency types in Delphi

Source: Internet
Author: User

With these years of Delphi, unexpectedly to currency and Tbcdfield smattering, the following gave a very good explanation, it is worth reading.

1. BCD type

BCD is binary-coded Decimal? In Delphi, the BCD field type can precisely hold floating-point data types.

The data type of the BCD code supported by Delphi is named TBCD, which is defined as follows:

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}


The support for BCD is in the Fmtbcd cell, so to use the BCD function, you need to reference this cell.

The BCD functions of Delphi are:


Calculates the and of two BCD codes


Compare the size of two BCD


Dividing BCD data


BCD Data multiplication


Returns the number of data for the BCD. A value of 123, such as the BCD return value of 3,BCD value 9382, is 4.


Returns the number of decimal digits of the BCD code


Two BCD code subtraction


Convert the BCD code to the current format data type


Convert BCD code to a double-formatted data type


BCD code converted to the data type in integer format


Convert BCD code to string


BCD code converted to a string with formatting control


Current data type converted to BCD code


Double data type conversion to BCD code


Format the BCD code as a string


Integer integer type converted to BCD code


Determine if the BCD is negative


Converts the value of one BCD to the value of a different BCD code based on the given precision and number of decimal digits


Determine if the BCD is null


Convert string to BCD code


Convert string to BCD code, conversion failure returns the given default value

2. Currency type

Identical to the money type in SQL Server, the currency type in Delphi:

1) occupies 8 bytes.

2) Always 4 decimal places.

3) Range: -2^63 ~ 2^63-1 ( -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807). the storage format is equivalent to always multiplying by 10000 and then saving in integer format.

3. BCD field type (tbcdfield)

The decimal and numeric data types are now available in many databases, they can precisely hold floating-point types, and decimal and numeric types can be mapped to BCD field types.

In the tdatabase control of BDE, there is a ENABLEBCD option:

The tadoquery of ADO also has the ENABLEBCD option.

The ENABLEBCD option is used to describe how to handle numeric types (decimal and numeric) fields:

1) When ENABLEBCD is true, the numeric Type field is mapped to the Tbcdfield class.

2) When ENABLEBCD is false, the numeric type field is mapped to the Tfloatfield class.

Tbcdfield is defined in the Db.pas file:

TBCDField = class(TNumericField)


  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;


  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;


  constructor Create(AOwner: TComponent); override;

  property Value: Currency read GetAsCurrency write SetAsCurrency;


  { 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;


Because Tbcdfield uses the currency type to hold the data (note: Not saved with TBCD), and currency is fixed with only 4 decimal places, the accuracy exceeds 4 bits using Tfloatfield (that is, ENABLEBCD bit false).

4. Reference Documents

    1. Direct support for BCD code in Delphi.


BCD and currency types in Delphi

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.