MySQL сумма прописью на украинском языке
Сумма (число) прописью на украинском языке (UTF8), в виде хранимой функции mysql. MySQL 5.5
FUNCTION NUM2STR_UKR ( Number, sex ) Возвращает - целое число прописью. Number - bigint sex - varchar = род числа: m-мужской, f-женский, s-средний.
FUNCTION FIN2STR_UKR ( Number ) Возвращает - сумму число прописью. Number - decimal(20,2)
Примечание: - Первый символ в верхнем регистре. - Копейки в формате '00'
Пример:
SELECT num2str_ukr( 25689724, 'f' )
-- двадцять п’ять мільйонів шістсот вісімдесят дев’ять тисяч сімсот двадцять чотири
SELECT num2str_ukr( 1, 'f' )
-- одна
SELECT num2str_ukr( 1, 'm' )
-- один
SELECT ( fin2str_ukr(123568.22) );
-- Сто двадцять три тисячі сімсот шістдесят вісімь гривень 22 копiйки
Портирована отсюда: sql.ru/forum Спасибо Автору!
DELIMITER $$
--
DROP FUNCTION IF EXISTS NUM2STR_UKR$$
DROP FUNCTION IF EXISTS FIN2STR_UKR$$
CREATE FUNCTION `NUM2STR_UKR`(Number BIGINT, sex varchar(2) ) RETURNS varchar(1000) CHARSET utf8
BEGIN
DECLARE result VARCHAR(1000);
DECLARE maxi BIGINT; -- верхние число
DECLARE ost100 BIGINT; -- цифра сотен
DECLARE ost10 BIGINT; -- цифра десяток
DECLARE ost BIGINT; -- цифра единиц
DECLARE f BIGINT; -- степень
DECLARE nvNumber BIGINT; -- нижнее число
DECLARE rd VARCHAR(30);
SET result = '';
-- TODO: отрицательные значения не обрабатываются!!!
SET nvNumber = ABS(Number);
-- варианты 'f', 'm', 's'
SET rd = sex;
sloop: LOOP
-- проверка для правильной работы логарифма
IF (nvNumber > 0)
THEN
-- ближайшая степень кратная трем
SET f = FLOOR( FLOOR( LOG(10, nvNumber)) / 3) * 3;
SET maxi = floor(nvNumber / power(10, f));
SET nvNumber = mod(nvNumber, power(10, f));
-- разложение на цифры
SET ost100 = floor(maxi / 100);
SET ost10 = floor((maxi - ost100 * 100) / 10);
-- SET ost = maxi - (ost100 * 100) - (ost10 * 10);
SET ost = (maxi - (ost10 * 10)) - (ost100 * 100);
-- сотни
CASE ost100
WHEN 1
THEN SET result = CONCAT(result,' сто');
WHEN 2
THEN SET result = CONCAT(result,' двісті');
WHEN 3
THEN SET result = CONCAT(result,' триста');
WHEN 4
THEN SET result = CONCAT(result, ' чотириста');
WHEN 5
THEN SET result = CONCAT(result, ' п’ятсот');
WHEN 6
THEN SET result = CONCAT(result, ' шістсот');
WHEN 7
THEN SET result = CONCAT(result, ' сімсот');
WHEN 8
THEN SET result = CONCAT(result, ' вісімсот');
WHEN 9
THEN SET result = CONCAT(result, ' дев’ятсот');
ELSE BEGIN END;
END CASE;
-- десятки
CASE ost10
WHEN 1
THEN
BEGIN
-- от 10 до 19
CASE ost
WHEN 1
THEN SET result = CONCAT(result,' одинадцять');
WHEN 2
THEN SET result = CONCAT(result,' дванадцять');
WHEN 3
THEN SET result = CONCAT(result,' тринадцять');
WHEN 4
THEN SET result = CONCAT(result,' чотирнадцять');
WHEN 5
THEN SET result = CONCAT(result,' п’ятнадцять');
WHEN 6
THEN SET result = CONCAT(result,' шістнадцять');
WHEN 7
THEN SET result = CONCAT(result,' сімнадцять');
WHEN 8
THEN SET result = CONCAT(result,' вісімнадцять');
WHEN 9
THEN SET result = CONCAT(result,' дев’ятнадцять');
WHEN 0
THEN SET result = CONCAT(result,' десять');
ELSE BEGIN END;
END CASE;
END;
WHEN 2
THEN SET result = CONCAT(result,' двадцять');
WHEN 3
THEN SET result = CONCAT(result,' тридцять');
WHEN 4
THEN SET result = CONCAT(result,' сорок');
WHEN 5
THEN SET result = CONCAT(result,' п’ятдесят');
WHEN 6
THEN SET result = CONCAT(result,' шістдесят');
WHEN 7
THEN SET result = CONCAT(result,' сімдесят');
WHEN 8
THEN SET result = CONCAT(result,' вісімдесят');
WHEN 9
THEN SET result = CONCAT(result,' дев’яносто');
ELSE BEGIN END;
END CASE;
-- единицы
IF ost10 <> 1
THEN
CASE ost
WHEN 1
THEN
BEGIN
IF f = 3
THEN
SET result = CONCAT(result,' одна');
ELSE
IF f = 0
THEN
CASE rd
WHEN 'm'
THEN SET result = CONCAT(result,' один');
WHEN 'f'
THEN SET result = CONCAT(result,' одна');
WHEN 's'
THEN SET result = CONCAT(result,' одно');
ELSE SET result = CONCAT(result,' один');
END CASE;
ELSE
SET result = CONCAT(result,' один');
END IF;
END IF;
END;
WHEN 2
THEN
BEGIN
IF (f = 3)
THEN
SET result = CONCAT(result, ' дві');
ELSE
IF f = 0
THEN
CASE rd
WHEN 'm'
THEN SET result = CONCAT(result,' два');
WHEN 'f'
THEN SET result = CONCAT(result,' дві');
WHEN 's'
THEN SET result = CONCAT(result,' два');
ELSE SET result = CONCAT(result,' два');
END CASE;
ELSE
SET result = CONCAT(result,' два');
END IF;
END IF;
END;
WHEN 3
THEN SET result = CONCAT(result,' три');
WHEN 4
THEN SET result = CONCAT(result,' чотири');
WHEN 5
THEN SET result = CONCAT(result,' п’ять');
WHEN 6
THEN SET result = CONCAT(result,' шість');
WHEN 7
THEN SET result = CONCAT(result,' сім');
WHEN 8
THEN SET result = CONCAT(result,' вісім');
WHEN 9
THEN SET result = CONCAT(result,' дев’ять');
ELSE BEGIN END;
END CASE;
END IF;
ELSE
LEAVE sloop;
END IF;
IF (f >= 36)
THEN
SET result = 'Занадто велике число!';
LEAVE sloop;
END IF;
IF (f >= 6 AND f < 36)
THEN
CASE f
WHEN 33
THEN SET result = CONCAT(result,' декальйон');
WHEN 30
THEN SET result = CONCAT(result,' нональйон');
WHEN 27
THEN SET result = CONCAT(result,' октальйон');
WHEN 24
THEN SET result = CONCAT(result,' септільйон');
WHEN 21
THEN SET result = CONCAT(result,' секстільйон');
WHEN 18
THEN SET result = CONCAT(result,' квінтильйон');
WHEN 15
THEN SET result = CONCAT(result,' квадрильйон');
WHEN 12
THEN SET result = CONCAT(result,' трильйон');
WHEN 9
THEN SET result = CONCAT(result,' мільярд');
WHEN 6
THEN SET result = CONCAT(result,' мільйон');
END CASE;
CASE
WHEN (ost = 0) OR (ost = 1 AND ost10 = 1) OR (ost >= 2 AND ost <= 4 AND ost10=1) OR (ost >= 5 AND ost <= 9)
THEN SET result = CONCAT( result, 'ів');
-- WHEN (ost = 1 AND ost10 <> 1)
-- THEN
WHEN (ost >= 2 AND ost <= 4 AND ost10 <> 1)
THEN SET result = CONCAT(result, 'а');
ELSE BEGIN END;
END CASE;
END IF;
-- тысячи
IF (f >= 3 AND f < 6)
THEN
CASE
WHEN (ost = 0) OR (ost = 1 AND ost10 = 1) OR (ost >= 2 AND ost <= 4 AND ost10 = 1) OR (ost >= 5 AND ost <= 9)
THEN SET result = CONCAT(result,' тисяч');
WHEN (ost = 1 AND ost10 <> 1)
THEN SET result = CONCAT(result,' тисяча');
WHEN (ost >= 2 AND ost <= 4 AND ost10 <> 1)
THEN SET result = CONCAT(result, ' тисячі');
ELSE BEGIN END;
END CASE;
END IF;
SET f = f - 3;
if( f < 0 ) THEN
LEAVE sloop;
END IF;
END LOOP;
RETURN TRIM(result);
END$$
CREATE FUNCTION `FIN2STR_UKR`( num DECIMAL(20,2) ) RETURNS varchar(1000) CHARSET utf8
BEGIN
DECLARE grn BIGINT; -- число гривен
declare kop bigint; -- число копеек
declare namegrn varchar(20); -- имя валюты - гривна
declare namekop varchar(20); -- имя валюты - копейка
declare result varchar(1000);
declare sgrn varchar(1000);
declare skop varchar(4);
declare z1,z2 BIGINT; -- значения разрядов
SET grn = Floor( num );
SET kop = floor( (num * 100) - (grn * 100) );
-- формируем склонение ГРИВНА
SET z1 = FLOOR(MOD(grn,10));
SET z2 = FLOOR(MOD(grn/10,10));
-- Если 11,12,13..19
if ( z2 = 1 ) Then
SET namegrn = 'гривень';
-- Для всех остальных случаев
else
CASE
WHEN (z1=1)
THEN SET namegrn = 'гривня';
WHEN (z1=2) or (z1=3) or (z1=4)
THEN SET namegrn = 'гривнi';
ELSE
-- Для чисел 5, 6, 7, 8, 9, 0
SET namegrn = 'гривень';
end case;
end If;
-- формируем склонение КОПІЙОК
SET z1 = FLOOR(MOD(kop,10));
SET z2 = FLOOR(MOD(kop/10,10));
-- Если 11,12,13..19
if ( z2 = 1 ) Then
SET namekop = 'копiйок';
-- Для всех остальных случаев
else
CASE
WHEN (z1=1)
THEN SET namekop = 'копiйка';
WHEN (z1=2) or (z1=3) or (z1=4)
THEN SET namekop = 'копiйки';
ELSE
-- Для чисел 5, 6, 7, 8, 9, 0
SET namekop = 'копiйок';
end case;
end if;
-- гривны преобразуем в строку
SET sgrn = num2str_ukr( grn , 'f' );
-- копейки - показываем цифрой
SET skop = kop;
if ( kop < 10 ) then
SET skop = CONCAT('0',kop );
end if;
-- делаем первый символ в верхнем регистре
SET result = CONCAT(sgrn,' ',namegrn, ' ', skop,' ',namekop);
RETURN CONCAT(UPPER(LEFT(result, 1)), SUBSTRING(result, 2));
END$$
DELIMITER ;