Variants and Type Conversions

13.1 Variants

Variants are slower and less safe. They're used for COM/OLE automation, database field values (Field.Value), and legacy code. TValue (System.Rtti) is the modern typed alternative.

uses System.Variants;
var V: Variant;
begin
  V := 42;          Writeln(VarTypeAsText(VarType(V)));  // Integer
  V := 'text';      V := 3.14;     V := Now;
  V := Null;        if VarIsNull(V) then Writeln('null');
  V := Unassigned;  if VarIsEmpty(V) then Writeln('empty');
  V := VarArrayOf([1, 'two', 3.0]);
  Writeln(V[1]);
end;

13.2 Conversions

Integer → string IntToStr, X.ToString, Format('%d'), IntToHex string → Integer

StrToInt, StrToIntDef, TryStrToInt, S.ToInteger, Val Float ↔ string

FloatToStr, FormatFloat, StrToFloat, TryStrToFloat (with TFormatSettings for culture)

DateToStr, DateTimeToStr, FormatDateTime, StrToDate, ISO8601ToDate, DateToISO8601 Boolean ↔ string BoolToStr(B, True), StrToBool

Integer(Ch), Ord, Chr, TMyEnum(N) Float → Integer Trunc, Round (banker's rounding), Ceil, Floor (System.Math)

Obj as TMyClass (checked), TMyClass(Obj) (unchecked hard cast), Obj is TMyClass

var FS := TFormatSettings.Create('en-US');
var D := StrToFloat('1234.56', FS);
Writeln(FormatFloat('#,##0.00', D, FS));
Writeln(FormatDateTime('yyyy-mm-dd hh:nn:ss', Now));    // note: nn = minutes

13.3 Dates and Times

TDateTime is a Double: the integer part is days since 1899-12-30, and the fraction is the time of day.

uses System.DateUtils;
var Today := Date; var NowDT := Now;
var Tomorrow := IncDay(Today);
var Age := YearsBetween(EncodeDate(1995, 6, 15), Today);
Writeln(DayOfTheWeek(Today), ' ', FormatDateTime('dddd', Today));
Writeln(DaysBetween(Today, EncodeDate(2025, 12, 31)));
var Stamp := DateTimeToUnix(Now); var Back := UnixToDateTime(Stamp);
var Utc := TTimeZone.Local.ToUniversalTime(Now);
var SW := TStopwatch.StartNew;   // System.Diagnostics
// ... work ...
Writeln(SW.ElapsedMilliseconds, ' ms');