program numbers;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, System.Character;
type
TNumberWord = record
Name: string;
Value: Integer;
end;
const
NumberWords: array [0..37] of TNumberWord = (
(Name: 'восемнадцать'; Value: 18),
(Name: 'восемь'; Value: 8),
(Name: 'восемьдесят'; Value: 80),
(Name: 'восемьсот'; Value: 800),
(Name: 'два'; Value: 2),
(Name: 'двадцать'; Value: 20),
(Name: 'две'; Value: 2),
(Name: 'двенадцать'; Value: 12),
(Name: 'двести'; Value: 200),
(Name: 'девяносто'; Value: 90),
(Name: 'девятнадцать'; Value: 19),
(Name: 'девять'; Value: 9),
(Name: 'девятьсот'; Value: 900),
(Name: 'десять'; Value: 10),
(Name: 'один'; Value: 1),
(Name: 'одиннадцать'; Value: 11),
(Name: 'одна'; Value: 1),
(Name: 'пятнадцать'; Value: 15),
(Name: 'пять'; Value: 5),
(Name: 'пятьдесят'; Value: 50),
(Name: 'пятьсот'; Value: 500),
(Name: 'семнадцать'; Value: 17),
(Name: 'семь'; Value: 7),
(Name: 'семьдесят'; Value: 70),
(Name: 'семьсот'; Value: 700),
(Name: 'сорок'; Value: 40),
(Name: 'сто'; Value: 100),
(Name: 'три'; Value: 3),
(Name: 'тридцать'; Value: 30),
(Name: 'тринадцать'; Value: 13),
(Name: 'триста'; Value: 300),
(Name: 'четыре'; Value: 4),
(Name: 'четыреста'; Value: 400),
(Name: 'четырнадцать'; Value: 14),
(Name: 'шестнадцать'; Value:16 ),
(Name: 'шесть'; Value: 6),
(Name: 'шестьдесят'; Value: 60),
(Name: 'шестьсот'; Value: 600));
function FromString(const Value: string): Currency;
function GetWord(var S: PChar): string;
var
E: PChar;
Len: Integer;
begin
while S^.IsWhiteSpace do Inc(S);
E := S;
while E^.IsLetter do Inc(E);
SetLength(Result, E - S);
Move(S^, Result[1], Length(Result) * SizeOf(Char));
S := E;
end;
var
S: PChar;
Current: string;
NumWord: TNumberWord;
NumPart: Int64;
begin
Result := 0;
NumPart := 0;
S := PChar(Value);
while S^ <> #0 do
begin
Current := GetWord(S);
if StrLComp(Pointer(Current), 'тысяч', 5) = 0 then
begin
Result := Result + NumPart * 1E3;
NumPart := 0;
end else if StrLComp(Pointer(Current), 'миллион', 7) = 0 then
begin
Result := Result + NumPart * 1E6;
NumPart := 0;
end else if StrLComp(Pointer(Current), 'миллиард', 8) = 0 then
begin
Result := Result + NumPart * 1E9;
NumPart := 0;
end else
for NumWord in NumberWords do
if Current = NumWord.Name then
begin
NumPart := NumPart + NumWord.Value;
Break;
end;
end;
Result := Result + NumPart;
end;
begin
try
Writeln(FromString('двенадцать миллионов шестьсот тридцать восемь тысяч сорок два'): 12:2);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
|