powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выводить год/года/лет в зависимости от числа
21 сообщений из 21, страница 1 из 1
Выводить год/года/лет в зависимости от числа
    #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
Выводить год/года/лет в зависимости от числа
    #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
Выводить год/года/лет в зависимости от числа
    #40005167
maksimpojar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, это просто опечатка. А подскажите пожалуйста, как проверять на последнюю цифру поля?
...
Рейтинг: 0 / 0
Выводить год/года/лет в зависимости от числа
    #40005171
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maksimpojar
Да, это просто опечатка. А подскажите пожалуйста, как проверять на последнюю цифру поля?
Последняя не поможет.
11, 12, ... - будет LET.
...
Рейтинг: 0 / 0
Выводить год/года/лет в зависимости от числа
    #40005174
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще - как и в любом языке программирования, MOD( N, 10 )
...
Рейтинг: 0 / 0
Выводить год/года/лет в зависимости от числа
    #40005181
maksimpojar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock
maksimpojar
Да, это просто опечатка. А подскажите пожалуйста, как проверять на последнюю цифру поля?
Последняя не поможет.
11, 12, ... - будет LET.

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

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

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

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

2) Если число лет больше 100 - отнять кол-во веков и посмотреть на остаток:
остаток меньше 10 - смотреть последнюю цифру (1)
11-19 - лет,
если остаток больше 10 - смотреть последнюю цифру (1).
...
Рейтинг: 0 / 0
Выводить год/года/лет в зависимости от числа
    #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
Выводить год/года/лет в зависимости от числа
    #40005278
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

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


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


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

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

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

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


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