-
Notifications
You must be signed in to change notification settings - Fork 1
/
camath.pas
128 lines (107 loc) · 3.08 KB
/
camath.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
unit caMath;
{$INCLUDE ca.inc}
interface
uses
// Standard Delphi units
Classes,
Sysutils,
// ca units
caClasses;
type
//---------------------------------------------------------------------------
// IcaValidNum
//---------------------------------------------------------------------------
IcaValidNumType = (vtInteger, vtFloat);
IcaValidNum = interface
['{EF66F544-E5E5-438F-9C4B-5140E94AB183}']
function GetIsValid: Boolean;
function GetNumType: IcaValidNumType;
function GetNumString: String;
procedure SetNumType(const Value: IcaValidNumType);
procedure SetNumString(const Value: String);
property IsValid: Boolean read GetIsValid;
property NumType: IcaValidNumType read GetNumType write SetNumType;
property NumString: String read GetNumString write SetNumString;
end;
//---------------------------------------------------------------------------
// TcaValidNum
//---------------------------------------------------------------------------
TcaValidNum = class(TInterfacedObject, IcaValidNum)
private
FIsValid: Boolean;
FNumString: String;
FNumType: IcaValidNumType;
FValidChars: set of Char;
FValidated: Boolean;
function GetIsValid: Boolean;
function GetNumString: String;
function GetNumType: IcaValidNumType;
procedure SetNumString(const Value: String);
procedure SetNumType(const Value: IcaValidNumType);
procedure UpdateValidChars;
public
constructor Create(ANumType: IcaValidNumType);
property IsValid: Boolean read GetIsValid;
property NumType: IcaValidNumType read GetNumType write SetNumType;
property NumString: String read GetNumString write SetNumString;
end;
implementation
//---------------------------------------------------------------------------
// TcaValidNum
//---------------------------------------------------------------------------
constructor TcaValidNum.Create(ANumType: IcaValidNumType);
begin
inherited Create;
SetNumType(ANumType);
end;
function TcaValidNum.GetIsValid: Boolean;
var
Index: Integer;
begin
if FValidated then
Result := FIsValid
else
begin
Result := True;
for Index := 1 to Length(FNumString) do
if not (FNumString[Index] in FValidChars) then
begin
FIsValid := False;
Result := FIsValid;
FValidated := True;
Break;
end;
end;
end;
function TcaValidNum.GetNumType: IcaValidNumType;
begin
Result := FNumType;
end;
function TcaValidNum.GetNumString: String;
begin
Result := FNumString;
end;
procedure TcaValidNum.SetNumType(const Value: IcaValidNumType);
begin
if Value <> FNumType then
begin
FNumType := Value;
UpdateValidChars;
end;
end;
procedure TcaValidNum.SetNumString(const Value: String);
begin
if Value <> FNumString then
begin
FNumString := Value;
FValidated := False;
end;
end;
procedure TcaValidNum.UpdateValidChars;
begin
case FNumType of
vtInteger: FValidChars := ['+', '-', '0'..'9'];
vtFloat: FValidChars := [DecimalSeparator, '+', '-', '0'..'9', 'E', 'e'];
end;
end;
end.