Ép kiểu
Chuyển đổi từ kiểu dữ liệu này sang kiểu dữ liệu khác
Chuyển đổi từ kiểu dữ liệu này sang kiểu dữ liệu khác
Ép kiểu (type casting) là chuyển đổi một biến từ kiểu dữ liệu này sang kiểu dữ liệu khác. Có 2 dạng ép kiểu:
Ép kiểu ngầm định (implicit cast): Do trình biên dịch tự động thực hiện
Ép kiểu rõ ràng (explicit cast): Do lập trình viên thực hiện. Ép kiểu explicit cũng có 2 dạng: ép theo kiểu cũ, sử dụng các hàm mới và sử dụng helper.
Khi bạn viết các biểu thức tính toán trong delphi, rất có thể ép kiểu ngầm định (implicit cast) được diễn ra. Hãy xem xét ví dụ sau
var
a: Integer;
b, c: Single;
begin
a := 3;
b := 1.5;
c := a + b; // c = 4.5
end.
Ép kiểu ngầm định xảy ra ở biểu thức a + b. Vì kết quả là một số thực nên biến a được ép sang kiểu Single trước khi cộng với b. Đó là ép kiểu ngầm định thực hiện bởi trình biên dịch.
Phần này mình nói sơ lược thôi vì nó không quan trọng lắm.
Trước đây, delphi cung cấp một cách đơn giản và ngắn gọn để chuyển đổi từ kiểu này sang kiểu khác.
Ví dụ, để chuyển biến F từ số thực sang số nguyên, sử dụng đoạn code
var
A: Single;
B: Integer;
begin
...
A := Single(B);
end;
Kiểu Single lúc này được sử dụng như một hàm, nhận vào một tham số là kiểu dữ liệu bất kì và trả về Single.
Chú ý: Một số ép kiểu bị chặn, ví dụ như ép từ Float về Integer vì sẽ gây ra mất mát dữ liệu.
Ép kiểu cũ được xem như là không an toàn. Do đó, thư viện System.SysUtils cung cấp một số hàm chuyển đổi kiểu dữ liệu an toàn hơn. Các hàm này chủ yếu ép từ string sang các kiểu khác và ngược lại.
Mình chỉ trình bày một số hàm cơ bản thôi, còn lại các bạn tự tìm hiểu thêm.
function StrToInt(const S: string): Integer;
function StrToFloat(const S: string): Single;
function StrToDateTime(const S: string): TDateTime;
function StrToBool(const S: string): Boolean;
function FloatToStr(const Value: Single): string;
function IntToStr(const Value: Integer): string;
function DateTimeToStr(const Value: TDateTime): string;
function BoolToStr(const Value: Boolean; UseBoolStrs: Boolean = False);
4 hàm trên là không an toàn, vì string không thể chuyển đổi hoàn toàn thành các kiểu khác (ví dụ như số 43no324 chuyển thành số không được). 4 hàm dưới là an toàn vì có thể chuyển hoàn toàn thành string.
Các hàm trên nhận vào tham số là kiểu ban đầu, trả về một kiểu khác như trên. Nếu không chuyển đổi được, thì một ngoại lệ được ném ra.
Để khắc phục lỗi đó, thì có kèm theo một số hàm khác (4 hàm trên có những hàm kèm theo).
function StrToIntDef(const S: string; Default: Boolean): Integer;
function StrToFloatDef(const S: string; Default: Boolean): Single;
function StrToDateTimeDef(const S: string; Default: Boolean): TDateTime;
function StrToBoolDef(const S: string; Default: Boolean): Boolean;
Các hàm này không khác gì những hàm trên, nhưng tên có thêm chữ Def. Hàm nhận 2 tham số, tham số thứ 2 là giá trị mặc định khi không chuyển đổi được.
Ví dụ, chuyển 2 chuỗi S1 và S2 thành A và B. Trong đó S1 không bị lỗi và S2 bị lỗi
var
S1, S2: string;
A, B: Integer;
begin
S1 := '12';
S2 := 'A24';
A := StrToIntDef(S1, -1); // A = 12 vì chuyển đổi thành công
B := StrToIntDef(S2, -1); // B = -1 là giá trị mặc định vì có lỗi xảy ra
end;
Các kiểu dữ liệu có thể có các method như class, gọi là các helper. Delphi cung cấp một số helper cho các kiểu như Boolean, Integer, Single, ... để chuyển đổi nhanh chóng và rõ ràng hơn là sử dụng các hàm trên.
Ví dụ, hàm ShowMessage chỉ nhận tham số là string, nhưng bạn muốn hiển thị biến A: Integer lên thì cần đổi A thành string. Hãy cùng so sánh 2 cách sau.
Cách 1:
var
A: Integer;
begin
A := -5;
ShowMessage(IntToStr(A);
end;
Cách 2:
var
A: Integer;
begin
A := -5;
ShowMessage(A.ToString);
end;
Rõ ràng, cách 2 rõ ràng và đẹp mắt hơn. Do đó, mình khuyên các bạn nên sử dụng helper để ép kiểu. Ngoài helper ToString, còn có ToInteger, ToSingle, ToBoolean, ToHexString, ...