-
Notifications
You must be signed in to change notification settings - Fork 9
/
GS.Common.TextConversion.pas
152 lines (118 loc) · 3.59 KB
/
GS.Common.TextConversion.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
unit GS.Common.TextConversion;
interface
uses SysUtils, Generics.Collections;
Type
IGSFloatConvertEngine = interface
function convert(aValue : Single) : string;
end;
TGSCustomnFloatConvertEngine = class(TInterfacedObject,IGSFloatConvertEngine)
Constructor Create; virtual;
function convert(aValue : Single) : string; Virtual; abstract;
Class function name : string; virtual; Abstract;
end;
TGSFloatConvertEngineClass = class of TGSCustomnFloatConvertEngine;
TGSJustForFunRomanConversion = class(TGSCustomnFloatConvertEngine)
function convert(aValue : Single) : string; override;
class function name : string; override;
end;
TGSTextConversionFactory = class
private
class var FDict : TDictionary<String,TGSFloatConvertEngineClass>;
class procedure CheckDict;
class procedure RelDict;
public
class function GetImplFloatToStringConverter(aName : string) : IGSFloatConvertEngine;
class procedure register(aName : String; aClass : TGSFloatConvertEngineClass);
end;
implementation
function HexToString(Hex: String): String;
var I : Integer;
begin
Result:= '';
for I := 1 to length (Hex) div 2 do
Result:= Result+Char(StrToInt('$'+Copy(Hex,(I-1)*2+1,2)));
end;
function StringToHex(Str: String): String;
var I: Integer;
begin
Result:= '';
for I := 1 to length (Str) do
Result:= Result+IntToHex(ord(Str[i]),2);
end;
function RomanNumber(Number:integer):string;
var
i,j,l: integer;
digit,valtest: integer;
numstr: string[4];
romtab: array[1..4] of string[3];
begin
romtab[1] := 'XVI';
romtab[2] := 'CLX';
romtab[3] := 'MDC';
romtab[4] := ' M';
result := '';
str(number,numstr);
l := length(numstr);
for i := 1 to l do begin
val(numstr[(l-i)+1],digit,valtest);
case digit of
0..3:
for j := 0 to digit-1 do begin
result := romtab[i][3] + result;
end; {end for}
4: result := romtab[i][3] + romtab[i][2] + result;
5..8:
begin
for j := 5 to digit-1 do begin
result := romtab[i][3] + result;
end; {end for}
result := romtab[i][2] + result
end;
9: result := romtab[i][3] + romtab[i][1] + result;
end; {end case}
end; {end for}
end; { roman }
{ TGSJustForFunRomanConversion }
function TGSJustForFunRomanConversion.convert(aValue: Single): string;
begin
result := RomanNumber(Round(aValue));
end;
class function TGSJustForFunRomanConversion.name: string;
begin
result := 'Roman';
end;
{ TGSTextConversionFactory }
class procedure TGSTextConversionFactory.CheckDict;
begin
if Not(Assigned(FDict)) then
FDict := TDictionary<String,TGSFloatConvertEngineClass>.Create;
end;
class function TGSTextConversionFactory.GetImplFloatToStringConverter(
aName: string): IGSFloatConvertEngine;
var l : TGSFloatConvertEngineClass;
begin
if FDict.TryGetValue(aName,l) then
result := (l.Create) as IGSFloatConvertEngine;
end;
class procedure TGSTextConversionFactory.register(aName : String; aClass: TGSFloatConvertEngineClass);
var l : TGSFloatConvertEngineClass;
begin
if not FDict.TryGetValue(aName,l) then
FDict.Add(aName,aClass);
end;
class procedure TGSTextConversionFactory.RelDict;
begin
FreeAndNil(FDict);
end;
{ TGSCustomnFloatConvertEngine }
{ TGSCustomnFloatConvertEngine }
constructor TGSCustomnFloatConvertEngine.Create;
begin
//Must be here to be called by inherited.
end;
Initialization
TGSTextConversionFactory.CheckDict;
TGSTextConversionFactory.register(TGSJustForFunRomanConversion.Name, TGSJustForFunRomanConversion);
Finalization
TGSTextConversionFactory.RelDict;
end.