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 ;