MySQL amount in words in Ukrainian
Amount (number) in words in Ukrainian (UTF8), as a stored mysql function. MySQL 5.5
FUNCTION NUM2STR_UKR ( Number, sex )
Returns - integer in words. Number - bigint sex - varchar = gender of number: m-masculine, f-feminine, s-neuter.
FUNCTION FIN2STR_UKR ( Number )
Returns - the sum in words. Number - decimal(20,2)
Note: - First character is uppercase. - Value after dot are in the format '00'
Example:
SELECT num2str_ukr( 25689724, 'f' )
-- двадцять п’ять мільйонів шістсот вісімдесят дев’ять тисяч сімсот двадцять чотири
SELECT num2str_ukr( 1, 'f' )
-- одна
SELECT num2str_ukr( 1, 'm' )
-- один
SELECT ( fin2str_ukr(123568.22) );
-- Сто двадцять три тисячі сімсот шістдесят вісімь гривень 22 копiйки
Ported from here: sql.ru/forum Thanks for author.
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; -- hundreds
DECLARE ost10 BIGINT; -- tens
DECLARE ost BIGINT; -- ones
DECLARE f BIGINT; -- deegree
DECLARE nvNumber BIGINT; -- low number
DECLARE rd VARCHAR(30);
SET result = '';
-- TODO: negative values are not processed!!!
SET nvNumber = ABS(Number);
-- cases 'f', 'm', 's'
SET rd = sex;
sloop: LOOP
-- check for correct operation of logarithm
IF (nvNumber > 0)
THEN
-- the nearest multiple of three
SET f = FLOOR( FLOOR( LOG(10, nvNumber)) / 3) * 3;
SET maxi = floor(nvNumber / power(10, f));
SET nvNumber = mod(nvNumber, power(10, f));
-- decomposition into numbers
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);
-- hundreds
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;
-- tens
CASE ost10
WHEN 1
THEN
BEGIN
-- from 10 to 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;
-- thoushands
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; -- grivnes
declare kop bigint; -- kopeiks
declare namegrn varchar(20); -- name of currency - grivna
declare namekop varchar(20); -- name of currency - kopeika
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) );
-- form the declension of HRIVNA
SET z1 = FLOOR(MOD(grn,10));
SET z2 = FLOOR(MOD(grn/10,10));
-- if 11,12,13..19
if ( z2 = 1 ) Then
SET namegrn = 'гривень';
-- for all other cases
else
CASE
WHEN (z1=1)
THEN SET namegrn = 'гривня';
WHEN (z1=2) or (z1=3) or (z1=4)
THEN SET namegrn = 'гривнi';
ELSE
-- for: 5, 6, 7, 8, 9, 0
SET namegrn = 'гривень';
end case;
end If;
-- form the declension of KOPIYOKS
SET z1 = FLOOR(MOD(kop,10));
SET z2 = FLOOR(MOD(kop/10,10));
-- If 11,12,13..19
if ( z2 = 1 ) Then
SET namekop = 'копiйок';
-- for all other cases
else
CASE
WHEN (z1=1)
THEN SET namekop = 'копiйка';
WHEN (z1=2) or (z1=3) or (z1=4)
THEN SET namekop = 'копiйки';
ELSE
-- if 5, 6, 7, 8, 9, 0
SET namekop = 'копiйок';
end case;
end if;
-- hryvnias are converted into a string
SET sgrn = num2str_ukr( grn , 'f' );
-- kopecks - show with numbers
SET skop = kop;
if ( kop < 10 ) then
SET skop = CONCAT('0',kop );
end if;
-- make the first character uppercase
SET result = CONCAT(sgrn,' ',namegrn, ' ', skop,' ',namekop);
RETURN CONCAT(UPPER(LEFT(result, 1)), SUBSTRING(result, 2));
END$$
DELIMITER ;