Created
March 30, 2021 11:43
-
-
Save Gladozzz/92634bf553e49d27d6e75b62fcddc3b9 to your computer and use it in GitHub Desktop.
pl/sql Function for getting a floating point number in words Число прописью.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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