unit XuStrUtils;
interface
Uses SysUtils, StrUtils;
Function IntToEnStr(Value: Integer): String; // Convert Integer to English
Function FloatToEnStr(Value: Extended; digit: Integer=2): String; // Convert float to English
Function FTFormatDate(DateTime: TDateTime): String; //Convert Date to [EnglishMonthName dd, yyyy]
implementation
Uses Math, XuFuncLib;
Const
// Ones: Array[0..9] of String=(' ZERO',' ONE',' TWO',' THREE',' FOUR',' FIVE',' SIX',' SEVEN',' EIGHT',' NINE');
// Teens : Array [0..9] of String = (' TEN',' ELEVEN', ' TWELVE',' THIRTEEN',' FOURTEEN',' FIFTEEN',' SIXTEEN',' SEVENTEEN',' EIGHTEEN',' NINETEEN');
OneToTeens: Array[0..19] of String=(' ZERO',' ONE',' TWO',' THREE',' FOUR',' FIVE',' SIX',' SEVEN',' EIGHT',' NINE',
' TEN',' ELEVEN',' TWELVE',' THIRTEEN',' FOURTEEN',' FIFTEEN',' SIXTEEN',' SEVENTEEN',' EIGHTEEN',' NINETEEN');
Tens: Array[0..9] of String =(' ZERO',' TEN',' TWENTY',' THIRTY',' FORTY',' FIFTY',' SIXTY',' SEVENTY',' EIGHTY',' NINETY');
Thousands:Array[1..4] of String = (' ', ' THOUSAND',' MILLION',' BILLION');
DotName = ' DOT';
HUNDREDName =' HUNDRED';
MaxDigit = 12;
Type
Str3 = String[3];
Function HunderdToEnStr(ns: Str3): String; //Call by IntToEnStr
Var
i: integer;
tmpStr: String;
begin
Result:='';
for i:=1 to 3 do
begin
case i of
1: case ns[1] of
'1'..'9': tmpStr:= OneToTeens[StrToInt(ns)]+ HUNDREDName;
else
tmpStr:='';
end;
2: case ns[2] of
'2'..'9': tmpStr:= Tens[StrToInt(ns)];
'1': tmpStr:=OneToTeens[StrToInt(ns[2]+ns[3])];
else
tmpStr:='';
end;
3: case ns[2] of
' ','0', '2'..'9': if ns<>'0' then
tmpStr:= OneToTeens[StrToInt(ns)]
else
tmpStr:='';
else
tmpStr:='';
end;
end;
Result:=Result+TmpStr;
end;
end;
Function IntToEnStr(Value: Integer): String;
Var
i: Integer;
cycCount: Integer;
SVal: String;
TmpStr: String;
SubStr: Str3;
begin
SVal:=IntToStr(Value);
Result:='';
if Length(SVal)>MaxDigit then
Raise Exception.CreateFmt('Out of Rang.'#13'Integer digit > %d', [MaxDigit]);
if Length(SVal)>3 then
CycCount:=(Length(SVal) DIV 3)+IIF((Length(SVal) MOD 3)>0)
else
CycCount:=1;
for i:=1 to CycCount do
begin
SubStr:=StringOfChar(' ',3-Length(RightStr(SVal,3)))+RightStr(SVal,3);
TmpStr:=HunderdToEnStr(SubStr);
if TmpStr<>'' then
Result:=TmpStr+Thousands+Result;
if Length(SVal)>=3 then
Delete(SVal,Length(SVal)-3+1, 3);
end;
Result:=Trim(Result);
end;
Function FloatToEnStr(Value: Extended; digit: Integer=2): String;
Var
IntStr: String;
SubStr: String;
i: Integer;
begin
IntStr:=IntToEnStr(Trunc(Value));
if Digit<=0 then
begin
Result:= IntStr;
Exit;
end
else
Result:=DotName;
SubStr:=IntToStr(Round((Value- Trunc(Value))*Power(10,digit)));
SubStr:=StringofChar('0',Digit-Length(SubStr))+SubStr;
for i:=1 to digit do
Result:=Result+ OneToTeens[StrToInt((SubStr))];
Result:=Trim(IntStr+Result);
end;
Var
WTFormatSettings: TFormatSettings;
Function FTFormatDate(DateTime: TDateTime): String;
begin
GetLocaleFormatSettings(09, WTFormatSettings);
Result:=FormatDateTime('mmmm dd, yyyy',DateTime, WTFormatSettings);
end;
end.