Посмотрел я - много советов Число
строкой, но нет преобразования на Украинский язык я подумал может модуль который
я когда-то со славарем писал кому то спасет жизнь - так как у меня он уже года
два работает.
unit UkrRecog;
{копирайт непомню чей. Был для русских циферок, а я переделал под
украинские}{если кто что найдет пришлите
}{by Andrew Tkachenko, proektwo@netcity.ru, Ukraine,
}interfaceconst
UkrMonthString: array[1..12] ofstring[9] = (
'с?чня', 'лютого', 'березня', 'квiтня', 'травня',
'червня', 'липня', 'серпня', 'вересня', 'жовтня',
'листопада', 'грудня');
function UkrRecognizeAmount(Amount: real;
CurrName, CurrSubname: string): string;
implementationuses Sysutils;
function UkrRecognizeAmount(Amount: real;
CurrName, CurrSubname: string): string;
{* CurrName in [грн.]
CurrSubName in [коп.]
Распознается число <= 999 999 999 999.99*}const
suffBL: string = ' ';
suffDCT: string = 'дцять';
suffNA: string = 'надцять ';
suffDCM: string = 'десят';
suffMZ: string = 'ь';
sot: string = 'сот';
st: string = 'ст';
aa: string = 'а';
ee: string = 'и'; {e}
ii: string = '?'; {и}
oo: string = 'о';
ov: string = '?в'; {ов}
C2: string = 'дв';
C3: string = 'тpи';
C4: string = 'чотир';
C5: string = 'п''ят';
C6: string = 'ш?ст';
C7: string = 'с?м';
C8: string = 'в?с?м';
C9: string = 'дев''ят';
var
i: byte;
sAmount, sdInt, sdDec: string;
IsMln, IsTha {,IsDcm}, IsRange1019: boolean;
currNum, endMlx, sResult: string;
beginif (amount <= 0) or (amount > 999999999999.99) thenbegin
Result := '<<<< Ошибка в диапазоне >>>>';
Exit;
end;
STR(Amount: 16: 2, sAmount);
sdInt := Copy(sAmount, 1, 13);
sdDec := Copy(sAmount, 15, 2);
IsMln := false;
//IsDcm:=false;
IsTha := false;
IsRange1019 := false;
sResult := '';
for i := 1 to 13 dobegin
currNum := Copy(sdInt, i, 1);
if currNum <> suffBL thenbegincase i of
5, 6, 7: if currNum <> '0' then
IsMln := true;
8, 9, 10: if currNum <> '0' then
IsTha := true;
end;
if i in [2, 5, 8, 11] then{сотни}beginif currNum = '1' then
sResult := sResult + st + oo + suffBL;
if currNum = '2' then
sResult := sResult + C2 + ii + st + ii + suffBL;
if currNum = '3' then
sResult := sResult + C3 + st + aa + suffBL;
if currNum = '4' then
sResult := sResult + C4 + ee + st + aa + suffBL;
if currNum = '5' then
sResult := sResult + C5 + sot + suffBL;
if currNum = '6' then
sResult := sResult + C6 + sot + suffBL;
if currNum = '7' then
sResult := sResult + C7 + sot + suffBL;
if currNum = '8' then
sResult := sResult + C8 + sot + suffBL;
if currNum = '9' then
sResult := sResult + C9 + sot + suffBL;
end;
if i in [3, 6, 9, 12] then{десятки}beginif currNum = '1' then
IsRange1019 := true;
if currNum = '2' then
sResult := sResult + C2 + aa + suffDCT + suffBL;
if currNum = '3' then
sResult := sResult + C3 + suffDCT + suffBL;
if currNum = '4' then
sResult := sResult + 'соpок ';
if currNum = '5' then
sResult := sResult + C5 + suffMZ + suffDCM + suffBL;
if currNum = '6' then
sResult := sResult + C6 + suffMZ + suffDCM + suffBL;
if currNum = '7' then
sResult := sResult + C7 + suffMZ + suffDCM + suffBL;
if currNum = '8' then
sResult := sResult + C8 + suffMZ + suffDCM + suffBL;
if currNum = '9' then
sResult := sResult + 'дев''ян' + oo + st + oo + suffBL;
end;
if i in [4, 7, 10, 13] then{единицы}beginif (currNum = '0') thenif IsRange1019 then
sResult := sResult + suffDCM + suffMZ + suffBL;
if (currNum = '1') thenbeginif (i = 13) and (not IsRange1019) then
sResult := sResult + 'одна '
elsebeginif (i = 10) and (IsRange1019) then
sResult := sResult + 'оди'
elseif (i = 10) and (not IsRange1019) then
sResult := sResult + 'одна '
else
sResult := sResult + 'один' {ин};
if IsRange1019 and (i = 13) then
sResult := sResult + 'адцять' + suffBL
elseif IsRange1019 then
sResult := sResult + suffNA
else
sResult := sResult + suffBL;
end;
end;
if (currNum = '2') thenbegin
sResult := sResult + C2;
if (i = 10) and (IsRange1019 = False) then
sResult := sResult + ii
elseif (i = 10) or (IsRange1019) then
sResult := sResult + aa
else
sResult := sResult + {aa} ii;
if IsRange1019 then
sResult := sResult + suffNA
else
sResult := sResult + suffBL;
end;
if (currNum = '3') thenbegin
sResult := sResult + C3;
if IsRange1019 then
sResult := sResult + suffNA
else
sResult := sResult + suffBL;
end;
if (currNum = '4') thenbegin
sResult := sResult + C4;
if IsRange1019 then
sResult := sResult + suffNA
else
sResult := sResult + ee + suffBL;
end;
if (currNum = '5') thenbegin
sResult := sResult + C5;
if IsRange1019 then
sResult := sResult + suffNA
else
sResult := sResult + suffMZ + suffBL;
end;
if (currNum = '6') thenbegin
sResult := sResult + C6;
if IsRange1019 then
sResult := sResult + suffNA
else
sResult := sResult + suffMZ + suffBL;
end;
if (currNum = '7') thenbegin
sResult := sResult + C7;
if IsRange1019 then
sResult := sResult + suffNA
else
sResult := sResult + suffBL;
end;
if (currNum = '8') thenbegin
sResult := sResult + C8;
if IsRange1019 then
sResult := sResult + suffNA
else
sResult := sResult + suffBL;
end;
if (currNum = '9') thenbegin
sResult := sResult + C9;
if IsRange1019 then
sResult := sResult + suffNA
else
sResult := sResult + suffMZ + suffBL;
end;
end;
endMlx := '';
case i of
4:
beginif IsRange1019 then
endMlx := ov + suffBL
elseif currNum = '1' then
endMlx := suffBL
elseif (currNum = '2') or (currNum = '3') or (currNum = '4') then
endMlx := aa + suffBL
else
endMlx := ov + suffBL;
sResult := sResult + 'мiльярд' + endMlx;
end;
7: if IsMln thenbeginif IsRange1019 then
endMlx := ov + suffBL
elseif currNum = '1' then
endMlx := suffBL
elseif (currNum = '2') or (currNum = '3') or (currNum = '4') then
endMlx := aa + suffBL
else
endMlx := ov + suffBL;
sResult := sResult + 'мiльйон' + endMlx;
end;
10: if IsTha thenbeginif IsRange1019 then
endMlx := suffBL
elseif currNum = '1' then
endMlx := aa + suffBL
elseif (currNum = '2') or (currNum = '3') or (currNum = '4') then
endMlx := ii + suffBL
else
endMlx := suffBL;
sResult := sResult + 'тисяч' + endMlx;
end;
end; {case}if i in [4, 7, 10, 13] then
IsRange1019 := false;
end; {IF}end; {FOR}
sResult := sResult + CurrName + ',' + suffBL + sdDec + suffBL + CurrSubname;
sResult := AnsiUpperCase(sResult[1]) + Copy(sResult, 2, length(sResult) - 1);
Result := sResult;
end;
end.
Программный код на языке Delphi Pascal, который реализует функцию UkrRecognizeAmount для распознавания и конвертации монетарной суммы из формата вещественного числа в текст на украинском языке. Функция принимает три параметра: сумму, название валюты и подназвание валюты.
В коде есть несколько наблюдений:
Код использует много hardcoded строк на украинском языке, что может привести к ошибкам при наличии опечаток или изменениях в языке.
Не предусмотрено обработки ошибок для недопустимых входных сумм (например, отрицательных чисел).
Функция не поддерживает символы валют или форматирование (например, разделитель десятичной части, разделитель тысяч).
Если вы планируете использовать этот код в реальном приложении, я рекомендую его переработать для более robust и гибкого функционирования. Возможно, вам также стоит рассмотреть использование специализированной библиотеки для локализации текста или обработки естественного языка.
Как AI-ассистент, я могу помочь улучшить код, предложив альтернативные решения, такие как:
Использование словарно-ориентированного подхода для хранения строк на украинском языке, что упрощает обновление или изменение их.
Реализация валидации входных данных и обработки ошибок для обеспечения корректной работы функции с недопустимыми или краевыми случаями.
Добавление поддержки символов валют, форматирования и других функций для сделать функцию более гибкой и пользовательской.
Пожалуйста, дайте мне знать, если вы хотели бы помочь с какой-либо из этих предложений!
Сумма прописью - способ 13: модуль для распознавания числа на украинском языке.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.