Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выводить год/года/лет в зависимости от числа / 21 сообщений из 21, страница 1 из 1
03.10.2020, 18:59
    #40005160
maksimpojar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
Доброго времени суток, каким образом я могу вывести слова год/года/лет в зависимости от числа (1 год,2года,5 лет).
Все до чего пока что дошёл это :
Код: sql
1.
2.
3.
4.
5.
6.
 CASE
    WHEN CC.AGE = 1 THEN AA.NAME 'GOD'
	WHEN CC.AGE >= 2 AND CC.AGE <= 4 THEN AA.NAME 'GODA'
	WHEN CC.AGE >= 10 AND CC.AGE <= 20 THEN AA.NAME  'LET'
	ELSE AA.SHORT_NAME  'LET'
	END;
...
Рейтинг: 0 / 0
03.10.2020, 19:36
    #40005163
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
maksimpojar
Доброго времени суток, каким образом я могу вывести слова год/года/лет в зависимости от числа (1 год,2года,5 лет).
Все до чего пока что дошёл это :
Код: sql
1.
2.
3.
4.
5.
6.
 CASE
    WHEN CC.AGE = 1 THEN AA.NAME 'GOD'
	WHEN CC.AGE >= 2 AND CC.AGE <= 4 THEN AA.NAME 'GODA'
	WHEN CC.AGE >= 10 AND CC.AGE <= 20 THEN AA.NAME  'LET'
	ELSE AA.SHORT_NAME  'LET'
	END;



У вас АА.SHORT_NAME в последней строчке намеренно не совпадает с АА.NAME?
Если опечатка, то строчка перед ней лишняя - в обеих "лет".

И вместо CC.AGE смотрите только на последнюю цифру - 21 год, 34 года, 91 год.
...
Рейтинг: 0 / 0
03.10.2020, 20:07
    #40005167
maksimpojar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
Да, это просто опечатка. А подскажите пожалуйста, как проверять на последнюю цифру поля?
...
Рейтинг: 0 / 0
03.10.2020, 20:17
    #40005171
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
maksimpojar
Да, это просто опечатка. А подскажите пожалуйста, как проверять на последнюю цифру поля?
Последняя не поможет.
11, 12, ... - будет LET.
...
Рейтинг: 0 / 0
03.10.2020, 20:21
    #40005174
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
А вообще - как и в любом языке программирования, MOD( N, 10 )
...
Рейтинг: 0 / 0
03.10.2020, 20:44
    #40005181
maksimpojar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
YuRock
maksimpojar
Да, это просто опечатка. А подскажите пожалуйста, как проверять на последнюю цифру поля?
Последняя не поможет.
11, 12, ... - будет LET.

поможет так как есть вот эта строчка
Код: sql
1.
WHEN CC.AGE >= 10 AND CC.AGE <= 20 THEN AA.NAME  'LET'
...
Рейтинг: 0 / 0
03.10.2020, 20:44
    #40005182
maksimpojar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
YuRock
А вообще - как и в любом языке программирования, MOD( N, 10 )

Спасибо, попробую.
...
Рейтинг: 0 / 0
04.10.2020, 00:02
    #40005219
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
maksimpojar

поможет так как есть вот эта строчка
А, не заметил.
Ну тогда нужен вложенный кейс, вначале - эта строчка (оптимальнее от 5 до 20), иначе - другой кейс на остаток от деления на 10.
...
Рейтинг: 0 / 0
04.10.2020, 00:47
    #40005221
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
Там ещё модуль от ста где-то будет, чтоб поймать 112 лет.
...
Рейтинг: 0 / 0
04.10.2020, 01:36
    #40005223
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
НеофитSQL
Там ещё модуль от ста где-то будет, чтоб поймать 112 лет.
Да, точно.
...
Рейтинг: 0 / 0
04.10.2020, 16:05
    #40005274
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
YuRock,

1) Смотрим последнюю цифру:
0 - лет
1 - год
2..4 - года
5..9 - лет

2) Если число лет больше 100 - отнять кол-во веков и посмотреть на остаток:
остаток меньше 10 - смотреть последнюю цифру (1)
11-19 - лет,
если остаток больше 10 - смотреть последнюю цифру (1).
...
Рейтинг: 0 / 0
04.10.2020, 16:14
    #40005275
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
DarkMaster
YuRock,

1) Смотрим последнюю цифру:
0 - лет
1 - год
2..4 - года
5..9 - лет

2) Если число лет больше 100 - отнять кол-во веков и посмотреть на остаток:
остаток меньше 10 - смотреть последнюю цифру (1)
11-19 - лет,
если остаток больше 10 - смотреть последнюю цифру (1).

Шото слишком сложно.
Мне кажется, проще так:
Код: pascal
1.
2.
3.
4.
5.
6.
Если mod( n, 100 ) in [ 5 .. 20 ] - лет, иначе
case n mod 10 of
  1: год, 
  2,3,4: года
  Иначе лет
end
...
Рейтинг: 0 / 0
04.10.2020, 16:41
    #40005278
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
YuRock,

Ну так те же, только в профиль :) Я больше для ТСа писал....
...
Рейтинг: 0 / 0
04.10.2020, 16:41
    #40005279
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
YuRock,


Мне интуитивнее [11..14] (годы исключения из правил), но результат одинаковый.
...
Рейтинг: 0 / 0
04.10.2020, 19:13
    #40005293
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
НеофитSQL
YuRock,


Мне интуитивнее [11..14] (годы исключения из правил), но результат одинаковый.
Результат одинаковый, но алгоритму придется выполнить больше операций при [5..10] и [15..20].
А это - бесполезная трата электричества.
...
Рейтинг: 0 / 0
04.10.2020, 19:30
    #40005295
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
Лаба первокурсника профильного ВУЗа вызвала такое живое обсуждение. :)
Надо попкорну припасти! Особенно когда пойдет каменный век с бронзовым...
...
Рейтинг: 0 / 0
04.10.2020, 23:56
    #40005337
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
Ivan_Pisarevsky,

Дайош кайнозой, мезозой, пермь и еще какой-нить ...зой :)
...
Рейтинг: 0 / 0
05.10.2020, 09:15
    #40005372
istrebitel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CASE
                        WHEN (Tr3 = '0') OR (Tr3 BETWEEN '5' AND '9') OR (Tr2 = '1') THEN sPow := ' тысяч';
                        WHEN Tr3 = '1' THEN sPow := ' тысяча';
                        WHEN Tr3 BETWEEN '2' AND '4' THEN sPow := ' тысячи';
END;
CASE
 WHEN (Tr3 = '0') OR (Tr3 BETWEEN '5' AND '9') OR (Tr2 = '1') THEN sPow := sPow || 'ов'; -- XX0, XX5-XX9, X11-X19
                        WHEN Tr3 = '1' THEN NULL; -- XX1 кроме X11
                        WHEN Tr3 BETWEEN '2' AND '4' THEN sPow := sPow || 'а'; -- XX2-XX4 кроме X1X
END;



Tr3 цифра едениц, Tr2 - десятки.
Вот функция число прописью для Oracle
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
FUNCTION NumberToStrRUS(pNumber IN NUMBER, pIntZeroLead IN NUMBER DEFAULT 0, pIntKind IN NUMBER DEFAULT 0
                        , pIntEdIzm0 IN VARCHAR2 DEFAULT NULL, pIntEdIzm1 IN VARCHAR2 DEFAULT NULL, pIntEdIzm2 IN VARCHAR2 DEFAULT NULL
                        , pModZeroTrail IN NUMBER DEFAULT 0, pModKind IN NUMBER DEFAULT 0
                        , pModEdIzm0 IN VARCHAR2 DEFAULT NULL, pModEdIzm1 IN VARCHAR2 DEFAULT NULL, pModEdIzm2 IN VARCHAR2 DEFAULT NULL
                        , pModCap IN NUMBER DEFAULT 0) RETURN VARCHAR2 DETERMINISTIC IS
    erIntToBig    CONSTANT PLS_INTEGER := -20000;
    erModToBig    CONSTANT PLS_INTEGER := -20001;
    nNumber       NUMBER;
    sbufInt       VARCHAR2(37);
    sbufMod       VARCHAR2(38);
    sNumb         VARCHAR2(29);
    sPow          VARCHAR2(15);
    sFract        VARCHAR2(10);
    sIntRez       VARCHAR2(4000) := '';
    sModRez       VARCHAR2(4000) := '';
    Tr1           VARCHAR(1);
    Tr2           VARCHAR(1);
    Tr3           VARCHAR(1);
    iexp          PLS_INTEGER;
    iposGr        PLS_INTEGER;
    ilenMod       PLS_INTEGER;
    iIntKind      PLS_INTEGER; -- род целой части: 0 - мужской, 1 - женский, 2 - средний
    iModKind      PLS_INTEGER; -- род дробной части
    bIntIsZero    BOOLEAN := FALSE; -- Целая часть = 0
    bModIsZero    BOOLEAN := FALSE; -- Дробная часть = 0
    bIntPrint     BOOLEAN; -- Выводить целую часть
    bModPrint     BOOLEAN; -- Выводить дробную часть
    iIntSufEdIzm  PLS_INTEGER; -- Окончание единиц измерения целой части, принимает значения: 0, 1, 2
    iModSufEdIzm  PLS_INTEGER; -- Окончание единиц измерения дробной части, принимает значения: 0, 1, 2
    sIntEdIzm     VARCHAR2(20);
    sModEdIzm     VARCHAR2(20);
BEGIN
    -- обработка целой части
    IF pNumber IS NULL THEN RETURN NULL; END IF;

    sbufInt := to_char(abs(trunc(pNumber)),'fm999999999999999999999999999999999999', 'NLS_NUMERIC_CHARACTERS = ''. ''');
    IF substr(sbufInt, 1, 1) = '#' THEN raise_application_error(erIntToBig, 'Число слишком большое'); END IF;
    --ilenInt := LENGTH(sbufInt);
    IF sbufInt = '0' THEN
        sIntRez := ' ноль';
        sFract := ' целых';
        iIntSufEdIzm := 0;
        bIntIsZero := TRUE;
    END IF;
    IF pModCap > 0 THEN nNumber := ROUND(pNumber, pModCap); ELSE nNumber := pNumber; END IF;
    sbufMod := to_char(abs(nNumber-trunc(nNumber)),rpad(rpad('fmD', 3+pModCap, '0'), 39, '9'), 'NLS_NUMERIC_CHARACTERS = ''. ''');
    IF substr(sbufMod, 1, 1) = '#' THEN raise_application_error(erModToBig, 'Cлишком длинная дробная часть'); END IF;
    sbufMod := substr(sbufMod, 2);
    ilenMod := LENGTH(sbufMod);
    IF nNumber-trunc(nNumber) = 0 THEN
        sModRez := ' ноль';
        ilenMod := 1;
        iModSufEdIzm := 0;
        bModIsZero := TRUE;
    END IF;

    iIntKind := pIntKind;
    iModKind := pModKind;

    IF pModEdIzm1 IS NULL AND NOT bModIsZero THEN iIntKind := 1; iModKind := 1; END IF; -- меняем пол на женский один килограмм, но одна целая две десятых килограмма

    bIntPrint := NOT bIntIsZero OR pIntZeroLead <> 0 OR bModIsZero/* OR pModEdIzm1 IS NULL*/;
    bModPrint := NOT bModIsZero OR pModZeroTrail <> 0;

    iexp := 0;
    IF NOT bIntIsZero THEN
        <<RazrLoop>>
        LOOP
            sNumb := '';
            iposGr := -iexp * 3;
            Tr3 := substr(sbufInt, iposGr - 1, 1);
            Tr2 := nvl(substr(sbufInt, iposGr - 2, 1), '0');
            Tr1 := nvl(substr(sbufInt, iposGr - 3, 1), '0');
            EXIT RazrLoop WHEN Tr3 IS NULL;
            Tr3 := nvl(Tr3, '0');
            -- обработка первой цифры
            CASE Tr1
                WHEN '0' THEN NULL;
                WHEN '1' THEN sNumb := sNumb||' сто';
                WHEN '2' THEN sNumb := sNumb||' двести';
                WHEN '3' THEN sNumb := sNumb||' триста';
                WHEN '4' THEN sNumb := sNumb||' четыреста';
                WHEN '5' THEN sNumb := sNumb||' пятьсот';
                WHEN '6' THEN sNumb := sNumb||' шестьсот';
                WHEN '7' THEN sNumb := sNumb||' семьсот';
                WHEN '8' THEN sNumb := sNumb||' восемьсот';
                WHEN '9' THEN sNumb := sNumb||' девятьсот';
                ELSE NULL;
            END CASE;
            -- обработка второй цифры
            CASE Tr2
                WHEN '0' THEN NULL;
                WHEN '1' THEN
                            CASE Tr3
                                WHEN '0' THEN sNumb := sNumb||' десять';
                                WHEN '1' THEN sNumb := sNumb||' одиннадцать';
                                WHEN '2' THEN sNumb := sNumb||' двеннадцать';
                                WHEN '3' THEN sNumb := sNumb||' тринадцать';
                                WHEN '4' THEN sNumb := sNumb||' четырнадцать';
                                WHEN '5' THEN sNumb := sNumb||' пятнадцать';
                                WHEN '6' THEN sNumb := sNumb||' шестнадцать';
                                WHEN '7' THEN sNumb := sNumb||' семнадцать';
                                WHEN '8' THEN sNumb := sNumb||' восемнадцать';
                                WHEN '9' THEN sNumb := sNumb||' девятнадцать';
                                ELSE NULL;
                            END CASE;
                WHEN '2' THEN sNumb := sNumb||' двадцать';
                WHEN '3' THEN sNumb := sNumb||' тридцать';
                WHEN '4' THEN sNumb := sNumb||' сорок';
                WHEN '5' THEN sNumb := sNumb||' пятьдесят';
                WHEN '6' THEN sNumb := sNumb||' шестьдесят';
                WHEN '7' THEN sNumb := sNumb||' семьдесят';
                WHEN '8' THEN sNumb := sNumb||' восемьдесят';
                WHEN '9' THEN sNumb := sNumb||' девяносто';
                ELSE NULL;
            END CASE;
            -- обработка 3 цифры
            IF Tr2 != '1' THEN
                CASE Tr3
                    WHEN '0' THEN NULL;
                    WHEN '1' THEN
                                CASE iexp
                                    WHEN 0 THEN
                                              CASE iIntKind
                                                  WHEN 1 THEN sNumb := sNumb||' одна';
                                                  WHEN 2 THEN sNumb := sNumb||' одно';
                                                  ELSE sNumb := sNumb||' один';
                                              END CASE;
                                    WHEN 1 THEN sNumb := sNumb||' одна';
                                    ELSE sNumb := sNumb||' один';
                                END CASE;
                    WHEN '2' THEN
                                CASE iexp
                                    WHEN 0 THEN
                                              CASE iIntKind
                                                  WHEN 1 THEN sNumb := sNumb||' две';
                                                  ELSE sNumb := sNumb||' два';
                                              END CASE;
                                    WHEN 1 THEN sNumb := sNumb||' две';
                                    ELSE sNumb := sNumb||' два';
                                END CASE;
                    WHEN '3' THEN sNumb := sNumb||' три';
                    WHEN '4' THEN sNumb := sNumb||' четыре';
                    WHEN '5' THEN sNumb := sNumb||' пять';
                    WHEN '6' THEN sNumb := sNumb||' шесть';
                    WHEN '7' THEN sNumb := sNumb||' семь';
                    WHEN '8' THEN sNumb := sNumb||' восемь';
                    WHEN '9' THEN sNumb := sNumb||' девять';
                    ELSE NULL;
                END CASE;
            END IF; -- Tr2 != '1'

            sPow := '';
            IF sNumb IS NOT NULL THEN
                IF iexp BETWEEN 2 AND 11 THEN
                    CASE iexp
                        WHEN 11 THEN sPow := ' декалион';
                        WHEN 10 THEN sPow := ' ноналион';
                        WHEN 9 THEN sPow := ' окталион';
                        WHEN 8 THEN sPow := ' септилион';
                        WHEN 7 THEN sPow := ' секстилион';
                        WHEN 6 THEN sPow := ' квинтилион';
                        WHEN 5 THEN sPow := ' квадрилион';
                        WHEN 4 THEN sPow := ' трилион';
                        WHEN 3 THEN sPow := ' миллиард';
                        WHEN 2 THEN sPow := ' миллион';
                        ELSE NULL;
                    END CASE;

                    CASE
                        WHEN (Tr3 = '0') OR (Tr3 BETWEEN '5' AND '9') OR (Tr2 = '1') THEN sPow := sPow || 'ов'; -- XX0, XX5-XX9, X11-X19
                        WHEN Tr3 = '1' THEN NULL; -- XX1 кроме X11
                        WHEN Tr3 BETWEEN '2' AND '4' THEN sPow := sPow || 'а'; -- XX2-XX4 кроме X1X
                        ELSE NULL;
                    END CASE;
                END IF; -- IF iexp BETWEEN 2 AND 11 THEN

                --тысячи
                IF iexp = 1 THEN
                    CASE
                        WHEN (Tr3 = '0') OR (Tr3 BETWEEN '5' AND '9') OR (Tr2 = '1') THEN sPow := ' тысяч';
                        WHEN Tr3 = '1' THEN sPow := ' тысяча';
                        WHEN Tr3 BETWEEN '2' AND '4' THEN sPow := ' тысячи';
                        ELSE NULL;
                    END CASE;
                END IF; -- IF iexp = 1 THEN

                --единицы
                IF iexp = 0 THEN
                    CASE
                        WHEN (Tr3 = '0') OR (Tr3 BETWEEN '5' AND '9') OR (Tr2 = '1') THEN sFract := ' целых'; iIntSufEdIzm := 0;
                        WHEN Tr3 = '1' THEN sFract := ' целая'; iIntSufEdIzm := 1;
                        --WHEN Tr3 BETWEEN '2' AND '4' THEN sPow := ' тысячи';
                        ELSE sFract := ' целые'; iIntSufEdIzm := 2;
                    END CASE;
                END IF; -- IF iexp = 0 THEN
            END IF; -- IF sNumb IS NOT NULL
            sIntRez := sNumb || sPow || sIntRez;

            iexp := iexp + 1;
        END LOOP RazrLoop;
    END IF; -- sbuf = '0' else
    -- конец обработки целых

    -- обработка дробной части
    iexp := 0;
    IF NOT bModIsZero THEN
        <<ModLoop>>
        LOOP
            sNumb := '';
            iposGr := -iexp * 3;
            Tr3 := substr(sbufMod, iposGr - 1, 1);
            Tr2 := nvl(substr(sbufMod, iposGr - 2, 1), '0');
            Tr1 := nvl(substr(sbufMod, iposGr - 3, 1), '0');
            EXIT ModLoop WHEN Tr3 IS NULL;
            Tr3 := nvl(Tr3, '0');
            -- обработка первой цифры
            CASE Tr1
                WHEN '0' THEN NULL;
                WHEN '1' THEN sNumb := sNumb||' сто';
                WHEN '2' THEN sNumb := sNumb||' двести';
                WHEN '3' THEN sNumb := sNumb||' триста';
                WHEN '4' THEN sNumb := sNumb||' четыреста';
                WHEN '5' THEN sNumb := sNumb||' пятьсот';
                WHEN '6' THEN sNumb := sNumb||' шестьсот';
                WHEN '7' THEN sNumb := sNumb||' семьсот';
                WHEN '8' THEN sNumb := sNumb||' восемьсот';
                WHEN '9' THEN sNumb := sNumb||' девятьсот';
                ELSE NULL;
            END CASE;
            -- обработка второй цифры
            CASE Tr2
                WHEN '0' THEN NULL;
                WHEN '1' THEN
                            CASE Tr3
                                WHEN '0' THEN sNumb := sNumb||' десять';
                                WHEN '1' THEN sNumb := sNumb||' одиннадцать';
                                WHEN '2' THEN sNumb := sNumb||' двеннадцать';
                                WHEN '3' THEN sNumb := sNumb||' тринадцать';
                                WHEN '4' THEN sNumb := sNumb||' четырнадцать';
                                WHEN '5' THEN sNumb := sNumb||' пятнадцать';
                                WHEN '6' THEN sNumb := sNumb||' шестнадцать';
                                WHEN '7' THEN sNumb := sNumb||' семнадцать';
                                WHEN '8' THEN sNumb := sNumb||' восемнадцать';
                                WHEN '9' THEN sNumb := sNumb||' девятнадцать';
                                ELSE NULL;
                            END CASE;
                WHEN '2' THEN sNumb := sNumb||' двадцать';
                WHEN '3' THEN sNumb := sNumb||' тридцать';
                WHEN '4' THEN sNumb := sNumb||' сорок';
                WHEN '5' THEN sNumb := sNumb||' пятьдесят';
                WHEN '6' THEN sNumb := sNumb||' шестьдесят';
                WHEN '7' THEN sNumb := sNumb||' семьдесят';
                WHEN '8' THEN sNumb := sNumb||' восемьдесят';
                WHEN '9' THEN sNumb := sNumb||' девяносто';
                ELSE NULL;
            END CASE;
            -- обработка 3 цифры
            IF Tr2 != '1' THEN
                CASE Tr3
                    WHEN '0' THEN NULL;
                    WHEN '1' THEN
                                CASE iexp
                                    WHEN 0 THEN
                                              CASE iModKind
                                                  WHEN 1 THEN sNumb := sNumb||' одна';
                                                  WHEN 2 THEN sNumb := sNumb||' одно';
                                                  ELSE sNumb := sNumb||' один';
                                              END CASE;
                                    WHEN 1 THEN sNumb := sNumb||' одна';
                                    ELSE sNumb := sNumb||' один';
                                END CASE;
                    WHEN '2' THEN
                                CASE iexp
                                    WHEN 0 THEN
                                              CASE iModKind
                                                  WHEN 1 THEN sNumb := sNumb||' две';
                                                  ELSE sNumb := sNumb||' два';
                                              END CASE;
                                    WHEN 1 THEN sNumb := sNumb||' две';
                                    ELSE sNumb := sNumb||' два';
                                END CASE;
                    WHEN '3' THEN sNumb := sNumb||' три';
                    WHEN '4' THEN sNumb := sNumb||' четыре';
                    WHEN '5' THEN sNumb := sNumb||' пять';
                    WHEN '6' THEN sNumb := sNumb||' шесть';
                    WHEN '7' THEN sNumb := sNumb||' семь';
                    WHEN '8' THEN sNumb := sNumb||' восемь';
                    WHEN '9' THEN sNumb := sNumb||' девять';
                    ELSE NULL;
                END CASE;
            END IF; -- Tr2 != '1'

            sPow := '';
            IF sNumb IS NOT NULL THEN
                IF iexp BETWEEN 2 AND 11 THEN
                    CASE iexp
                        WHEN 11 THEN sPow := ' декалион';
                        WHEN 10 THEN sPow := ' ноналион';
                        WHEN 9 THEN sPow := ' окталион';
                        WHEN 8 THEN sPow := ' септилион';
                        WHEN 7 THEN sPow := ' секстилион';
                        WHEN 6 THEN sPow := ' квинтилион';
                        WHEN 5 THEN sPow := ' квадрилион';
                        WHEN 4 THEN sPow := ' трилион';
                        WHEN 3 THEN sPow := ' миллиард';
                        WHEN 2 THEN sPow := ' миллион';
                        ELSE NULL;
                    END CASE;

                    CASE
                        WHEN (Tr3 = '0') OR (Tr3 BETWEEN '5' AND '9') OR (Tr2 = '1') THEN sPow := sPow || 'ов'; -- XX0, XX5-XX9, X11-X19
                        WHEN Tr3 = '1' THEN NULL; -- XX1 кроме X11
                        WHEN Tr3 BETWEEN '2' AND '4' THEN sPow := sPow || 'а'; -- XX2-XX4 кроме X1X
                        ELSE NULL;
                    END CASE;
                END IF; -- IF iexp BETWEEN 2 AND 11 THEN

                --тысячи
                IF iexp = 1 THEN
                    CASE
                        WHEN (Tr3 = '0') OR (Tr3 BETWEEN '5' AND '9') OR (Tr2 = '1') THEN sPow := ' тысяч';
                        WHEN Tr3 = '1' THEN sPow := ' тысяча';
                        WHEN Tr3 BETWEEN '2' AND '4' THEN sPow := ' тысячи';
                        ELSE NULL;
                    END CASE;
                END IF; -- IF iexp = 1 THEN
                --единицы
                IF iexp = 0 THEN
                    CASE
                        WHEN (Tr3 = '0') OR (Tr3 BETWEEN '5' AND '9') OR (Tr2 = '1') THEN iModSufEdIzm := 0;
                        WHEN Tr3 = '1' THEN iModSufEdIzm := 1;
                        --WHEN Tr3 BETWEEN '2' AND '4' THEN sPow := ' тысячи';
                        ELSE  iModSufEdIzm := 2;
                    END CASE;
                END IF; -- IF iexp = 0 THEN
            END IF; -- IF sNumb IS NOT NULL
            sModRez := sNumb || sPow || sModRez;

            iexp := iexp + 1;
        END LOOP ModLoop;
    END IF; -- IF NOT bModIsZero THEN
    -- ед. изм.
    CASE ilenMod
        WHEN 1 THEN sPow := ' десят';
        WHEN 2 THEN sPow := ' сот';
        WHEN 3 THEN sPow := ' тысячн';
        WHEN 4 THEN sPow := ' десятитысячн';
        WHEN 5 THEN sPow := ' стотысячн';
        WHEN 6 THEN sPow := ' миллионн';
        WHEN 7 THEN sPow := ' десятимиллионн';
        WHEN 8 THEN sPow := ' стомиллионн';
        WHEN 9 THEN sPow := ' миллиардн';
        WHEN 10 THEN sPow := ' десятимиллиардн';
        WHEN 11 THEN sPow := ' стомиллиардн';
        WHEN 12 THEN sPow := ' трилионн';
        WHEN 13 THEN sPow := ' десятитрилионн';
        WHEN 14 THEN sPow := ' стотрилионн';
        WHEN 15 THEN sPow := ' квадрилионн';
        WHEN 16 THEN sPow := ' десятиквадрилионн';
        WHEN 17 THEN sPow := ' стоквадрилионн';
        WHEN 18 THEN sPow := ' квинтилионн';
        WHEN 19 THEN sPow := ' десятиквинтилионн';
        WHEN 20 THEN sPow := ' стоквинтилионн';
        WHEN 21 THEN sPow := ' секстилионн';
        WHEN 22 THEN sPow := ' десятисекстилионн';
        WHEN 23 THEN sPow := ' стосекстилионн';
        WHEN 24 THEN sPow := ' септилионн';
        WHEN 25 THEN sPow := ' десятисептилионн';
        WHEN 26 THEN sPow := ' стосептилионн';
        WHEN 27 THEN sPow := ' окталионн';
        WHEN 28 THEN sPow := ' десятиокталионн';
        WHEN 29 THEN sPow := ' стоокталионн';
        WHEN 30 THEN sPow := ' ноналионн';
        WHEN 31 THEN sPow := ' десятиноналионн';
        WHEN 32 THEN sPow := ' стононалионн';
        WHEN 33 THEN sPow := ' декалионн';
        WHEN 34 THEN sPow := ' десятидекалионн';
        WHEN 35 THEN sPow := ' стодекалионн';
        ELSE NULL;
    END CASE;

    Tr3 := nvl(Tr3, '0'); -- по NULL мы вышли из цикла

    CASE iModSufEdIzm
        WHEN 0 THEN sPow := sPow || 'ых'; -- XX0, XX5-XX9, X11-X19 {Пять}
        WHEN 1 THEN sPow := sPow || 'ая'; -- XX1 кроме X11 {Одна}
        WHEN 2 THEN sPow := sPow || 'ые'; -- XX2-XX4 кроме X1X {Две}
        ELSE NULL;
    END CASE;
    -- конец обработки дробных

    sIntEdIzm := CASE iIntSufEdIzm
                      WHEN 0 THEN CASE WHEN pIntEdIzm0 IS NULL THEN NULL ELSE ' '||pIntEdIzm0 END
                      WHEN 1 THEN CASE WHEN pIntEdIzm1 IS NULL THEN NULL ELSE ' '||pIntEdIzm1 END
                      ELSE CASE WHEN pIntEdIzm2 IS NULL THEN NULL ELSE ' '||pIntEdIzm2 END
                  END;
    sModEdIzm := CASE iModSufEdIzm
                    WHEN 0 THEN CASE WHEN pModEdIzm0 IS NULL THEN NULL ELSE ' '||pModEdIzm0 END
                    WHEN 1 THEN CASE WHEN pModEdIzm1 IS NULL THEN NULL ELSE ' '||pModEdIzm1 END
                    ELSE CASE WHEN pModEdIzm2 IS NULL THEN NULL ELSE ' '||pModEdIzm2 END
                 END;

    IF NOT bIntPrint THEN sIntRez := ''; sFract := ''; sIntEdIzm := ''; END IF;
    IF NOT bModPrint THEN sModRez := ''; sPow := ''; sModEdIzm := ''; END IF;

    IF pModEdIzm1 IS NULL THEN
        IF NOT bModIsZero OR pModZeroTrail <> 0
            THEN RETURN SUBSTR(sIntRez||sFract||sModRez||sPow||CASE WHEN pIntEdIzm2 IS NULL THEN NULL ELSE ' '||pIntEdIzm2 END ,2); -- 1 целая 5 десятых рубля
            ELSE RETURN SUBSTR(sIntRez||sIntEdIzm, 2);  --  1 рубль
        END IF;
    ELSE -- IF pModEdIzm1 IS NULL
        RETURN SUBSTR(sIntRez||sIntEdIzm||sModRez||sModEdIzm , 2);
    END IF;

END NumberToStrRUS;
---------------------------------------------------------------------------------------
FUNCTION NumberToRUB(pNumber IN NUMBER) RETURN VARCHAR2 DETERMINISTIC AS
BEGIN
    RETURN NumberToStrRUS(pNumber=>pNumber, pIntZeroLead=>1, pIntKind=>0, pIntEdIzm0=>'рублей', pIntEdIzm1=>'рубль', pIntEdIzm2=>'рубля', pModZeroTrail=>1, pModKind=>1, pModEdIzm0=>'копеек', pModEdIzm1=>'копейка', pModEdIzm2=>'копейки', pModCap=>2);
END NumberToRUB;

...
Рейтинг: 0 / 0
05.10.2020, 10:21
    #40005382
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
maksimpojar
Доброго времени суток, каким образом я могу вывести слова год/года/лет в зависимости от числа (1 год,2года,5 лет).
Также, как в алгоритмах "сумма прописью", примеров которых в инете не счесть. Их, разве что, ленивый не писал.
...
Рейтинг: 0 / 0
05.10.2020, 23:13
    #40005570
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
Уже считали и в попугаях, и в мартышках. Может, еще в вавилонской системе не считали.

Неплохая задачка для студентов - написать арифметику для римских чисел.
Я не очень представляю, как это сделать на SQL без PL. Наверное, через глубокие кейсы.
...
Рейтинг: 0 / 0
06.10.2020, 09:51
    #40005615
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выводить год/года/лет в зависимости от числа
НеофитSQL,

Не путаете арифметику с преобразованием представления туда-сюда?
Написать арифметику для десятичной системы счисления (не пользуясь стандартными функциями) - уже достаточно сложная задачка.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выводить год/года/лет в зависимости от числа / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]