Skip to content

Instantly share code, notes, and snippets.

@Gladozzz
Created March 30, 2021 11:43
Show Gist options
  • Save Gladozzz/92634bf553e49d27d6e75b62fcddc3b9 to your computer and use it in GitHub Desktop.
Save Gladozzz/92634bf553e49d27d6e75b62fcddc3b9 to your computer and use it in GitHub Desktop.
pl/sql Function for getting a floating point number in words Число прописью.
-- I just changed someone else's function to fit my needs, but I don't remember where I got the code from.
FUNCTION float_to_str (pnum IN NUMBER,
pdot IN NUMBER := 2,
ost_mode IN NUMBER := NULL,
postfix IN VARCHAR2 := '')
RETURN VARCHAR2
IS
dot NUMBER;
num NUMBER;
integer_part NUMBER := 0;
ostatok NUMBER := 0;
integer_part_text VARCHAR2 (32767);
ostatok_text VARCHAR2 (32767);
FUNCTION num_to_text (pn NUMBER)
RETURN VARCHAR2
IS
n NUMBER;
TYPE mass IS TABLE OF VARCHAR2 (13)
INDEX BY BINARY_INTEGER;
TYPE rec IS RECORD
(
a VARCHAR2 (12),
b VARCHAR2 (12),
c VARCHAR2 (12),
d VARCHAR2 (12),
e VARCHAR2 (12),
k VARCHAR2 (12)
);
TYPE razr IS TABLE OF rec
INDEX BY BINARY_INTEGER;
m1 mass;
m1a mass;
m11 mass;
m10 mass;
m100 mass;
r razr;
c VARCHAR2 (255);
k NUMBER;
i NUMBER;
again BOOLEAN;
BEGIN
--********************************** Заполняем массивы данными
m1 (0) := '';
m1 (1) := 'одна ';
m1 (2) := 'две ';
m1 (3) := 'три ';
m1 (4) := 'четыре ';
m1 (5) := 'пять ';
m1 (6) := 'шесть ';
m1 (7) := 'семь ';
m1 (8) := 'восемь ';
m1 (9) := 'девять ';
--------------------------------
m1a (0) := '';
m1a (1) := 'одна ';
m1a (2) := 'две ';
m1a (3) := 'три ';
m1a (4) := 'четыре ';
m1a (5) := 'пять ';
m1a (6) := 'шесть ';
m1a (7) := 'семь ';
m1a (8) := 'восемь ';
m1a (9) := 'девять ';
-- от 11 до 19
m11 (0) := '';
m11 (1) := 'одиннадцать ';
m11 (2) := 'двенадцать ';
m11 (3) := 'тринадцать ';
m11 (4) := 'четырнадцать ';
m11 (5) := 'пятнадцать ';
m11 (6) := 'шестнадцать ';
m11 (7) := 'семнадцать ';
m11 (8) := 'восемнадцать ';
m11 (9) := 'девятнадцать ';
-- 2 разряд
m10 (0) := '';
m10 (1) := 'десять ';
m10 (2) := 'двадцать ';
m10 (3) := 'тридцать ';
m10 (4) := 'сорок ';
m10 (5) := 'пятьдесят ';
m10 (6) := 'шестьдесят ';
m10 (7) := 'семьдесят ';
m10 (8) := 'восемьдесят ';
m10 (9) := 'девяносто ';
-- 3 разряд
m100 (0) := '';
m100 (1) := 'сто ';
m100 (2) := 'двести ';
m100 (3) := 'триста ';
m100 (4) := 'четыреста ';
m100 (5) := 'пятьсот ';
m100 (6) := 'шестьсот ';
m100 (7) := 'семьсот ';
m100 (8) := 'восемьсот ';
m100 (9) := 'девятьсот ';
-------------------
r (0).a := '';
r (1).a := '';
r (2).a := '';
r (3).a := '';
r (4).a := '';
r (5).a := '';
r (6).a := '';
r (7).a := '';
r (8).a := '';
r (9).a := '';
-------------------
r (0).b := 'тысяч ';
r (1).b := 'тысяча ';
r (2).b := 'тысячи ';
r (3).b := 'тысячи ';
r (4).b := 'тысячи ';
r (5).b := 'тысяч ';
r (6).b := 'тысяч ';
r (7).b := 'тысяч ';
r (8).b := 'тысяч ';
r (9).b := 'тысяч ';
-------------------------
r (0).c := 'миллионов ';
r (1).c := 'миллион ';
r (2).c := 'миллиона ';
r (3).c := 'миллиона ';
r (4).c := 'миллиона ';
r (5).c := 'миллионов ';
r (6).c := 'миллионов ';
r (7).c := 'миллионов ';
r (8).c := 'миллионов ';
r (9).c := 'миллионов ';
---------------------------
r (0).d := 'миллиардов ';
r (1).d := 'миллиард ';
r (2).d := 'миллиарда ';
r (3).d := 'миллиарда ';
r (4).d := 'милииарда ';
r (5).d := 'миллионов ';
r (6).d := 'миллионов ';
r (7).d := 'миллионов ';
r (8).d := 'миллионов ';
r (9).d := 'миллионов ';
------------------------------
n := ROUND (pn);
IF n = 0
THEN
c := 'ноль ' || c;
ELSE
i := 1;
again := TRUE;
WHILE again
LOOP
IF MOD (n, 100) > 10 AND MOD (n, 100) < 20
THEN
c := r (0).a || c;
c := m11 (MOD (n, 10)) || c;
ELSE
c := r (MOD (n, 10)).a || c;
IF i = 2
THEN
c := m1a (MOD (n, 10)) || c;
ELSE
c := m1 (MOD (n, 10)) || c;
END IF;
c := m10 (MOD (TRUNC (n / 10, 0), 10)) || c;
END IF;
c := m100 (MOD (TRUNC (n / 100, 0), 10)) || c;
n := TRUNC (n / 1000, 0);
IF n = 0
THEN
again := FALSE;
END IF;
FOR j IN 0 .. 9
LOOP
IF i = 1
THEN
r (j).a := r (j).b;
END IF;
IF i = 2
THEN
r (j).a := r (j).c;
END IF;
IF i = 3
THEN
r (j).a := r (j).d;
END IF;
IF MOD (n, 1000) = 0
THEN
r (j).a := '';
END IF;
END LOOP;
i := i + 1;
END LOOP;
END IF;
RETURN c;
END;
BEGIN
dot := pdot;
num := abs(pnum);
IF dot > 6
THEN
dot := 6;
ELSIF dot < 0
THEN
dot := 0;
END IF;
IF dot = 0
THEN
integer_part := ROUND (num);
ELSE
integer_part := trunc (num, 0);
END IF;
ostatok := round(mod(num * power(10, dot), power(10, dot)));
-- DBMS_OUTPUT.put_line (integer_part);
-- DBMS_OUTPUT.put_line (ostatok);
-------------------------------------------------------
integer_part_text := num_to_text (integer_part);
IF ost_mode is null
THEN
ostatok_text := num_to_text (ostatok);
ELSE
ostatok_text := TO_CHAR (ostatok||' ');
END IF;
-------------------------------------------------------
if dot = 0 then
return integer_part_text;
end if;
integer_part_text :=
integer_part_text
|| CASE
WHEN MOD (integer_part, 10) = 1 and MOD (integer_part, 100) <> 11 THEN ('целая')
ELSE ('целых')
END;
ostatok_text :=
ostatok_text
||
CASE
WHEN mod(ostatok, 10) = 1 and mod(ostatok, 100) <> 11
THEN
(CASE dot
WHEN 1 THEN 'десятая'
WHEN 2 THEN 'сотая'
WHEN 3 THEN 'тысячная'
WHEN 4 THEN 'десятитысячная'
WHEN 5 THEN 'стотысячная'
WHEN 6 THEN 'миллионная'
ELSE ''
END)
ELSE
(CASE dot
WHEN 1 THEN 'десятых'
WHEN 2 THEN 'сотых'
WHEN 3 THEN 'тысячных'
WHEN 4 THEN 'десятитысячных'
WHEN 5 THEN 'стотысячных'
WHEN 6 THEN 'миллионных'
ELSE ''
END)
END
|| ' '
|| postfix;
-- DBMS_OUTPUT.put_line (integer_part_text);
-- DBMS_OUTPUT.put_line (ostatok_text);
-- DBMS_OUTPUT.put_line (integer_part_text || ' ' || ostatok_text);
RETURN integer_part_text || ' ' || ostatok_text;
END;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment