Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 цифры прописью  [new]
mikevolgo
Member

Откуда:
Сообщений: 1
Помогите плиз. Как можно сделать выборку суммы чисел из орокловой базы и это значение вывести прописью?
24 май 07, 16:24    [4181214]     Ответить | Цитировать Сообщить модератору
 Re: цифры прописью  [new]
iV@n
Member

Откуда:
Сообщений: 382
поиск
24 май 07, 16:27    [4181236]     Ответить | Цитировать Сообщить модератору
 Re: цифры прописью  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15504
напр
24 май 07, 16:30    [4181244]     Ответить | Цитировать Сообщить модератору
 Re: цифры прописью  [new]
Александр Соколов
Member

Откуда: Протвино
Сообщений: 1419
Том Кайт: об убыстрении, особенностях работы с NLS-параметрами и написании чисел по буквам
http://www.oracle.com/technology/oramag/oracle/06-jul/o46asktom.html
24 май 07, 19:32    [4182108]     Ответить | Цитировать Сообщить модератору
 Re: цифры прописью  [new]
RomanT
Member

Откуда: Kharkov
Сообщений: 64
SELECT DECODE(SIGN(:NUM), -1, 'минус ')||
DECODE(TRUNC(:NUM), 0, 'ноль ') ||
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(LTRIM(TO_CHAR(ABS(:NUM),
'9,9,,9,,,,,,9,9,,9,,,,,9,9,,9,,,,9,9,,9,,,.99')) || 'k',
',,,,,,', 'er'),
',,,,,', 'em'),
',,,,', 'et'),
',,,', 'e'),
',,', 'd'),
',', 'c'),
'0c0d0et', ''),
'0c0d0em', ''),
'0c0d0er', ''),
'0c', ''),
'1c', 'сто '),
'2c', 'двести '),
'3c', 'триста '),
'4c', 'четыреста '),
'5c', 'пятьсот '),
'6c', 'шестьсот '),
'7c', 'семьсот '),
'8c', 'восемьсот '),
'9c', 'девятьсот '),
'1d0e', 'десять '),
'1d1e', 'одиннадцать '),
'1d2e', 'двенадцать '),
'1d3e', 'тринадцать '),
'1d4e', 'четырнадцать '),
'1d5e', 'пятнадцать '),
'1d6e', 'шестнадцать '),
'1d7e', 'семьнадцать '),
'1d8e', 'восемнадцать '),
'1d9e', 'девятнадцать '),
'0d', ''),
'2d', 'двадцать '),
'3d', 'тридцать '),
'4d', 'сорок '),
'5d', 'пятьдесят '),
'6d', 'шестьдесят '),
'7d', 'семьдесят '),
'8d', 'восемьдесят '),
'9d', 'девяносто '),
'0e', ''),
'5e', 'пять '),
'6e', 'шесть '),
'7e', 'семь '),
'8e', 'восемь '),
'9e', 'девять '),
'1e.', 'одна гривна '),
'2e.', 'две гривны '),
'3e.', 'три гривны '),
'4e.', 'четыре гривны '),
'1et', 'одна тысяча '),
'2et', 'две тысячи '),
'3et', 'три тысячи '),
'4et', 'четыре тысячи '),
'1em', 'один миллион '),
'2em', 'два миллиона '),
'3em', 'три миллиона '),
'4em', 'четыре миллиона '),
'1er', 'один милиард '),
'2er', 'два милиарда '),
'3er', 'три милиарда '),
'4er', 'четыре милиарда '),
'11k', '11 копеек'),
'12k', '12 копеек'),
'13k', '13 копеек'),
'14k', '14 копеек'),
'1k', '1 копейка'),
'2k', '2 копейки'),
'3k', '3 копейки'),
'4k', '4 копейки'),
't', 'тысяч '),
'm', 'миллионов '),
'r', 'милиардов '),
'k', ' копeeк'),
'.', 'гривень ')
FROM dual
29 май 07, 14:59    [4199372]     Ответить | Цитировать Сообщить модератору
 Re: цифры прописью  [new]
sadik
Member

Откуда: Курск
Сообщений: 55
create or replace function NumberToStrRUS(nNumber in number, idpKind in number) return varchar2 is
    Result varchar2(4000); --результат
    maxi number;           --верхние число
    ost100 number;         --цифра сотен
    ost10 number;          --цифра десяток
    ost number;            --цифра единиц
    f number;              --степень
    nvNumber number;       --нижнее число
    rd varchar2(30);
begin
  --инициализация
  result := '';
  nvNumber := nNumber;
  if idpKind is null or idpKind = 0 then -- мужской род
    rd := 'm';
  elsif idpKind = 1 then -- женский род
    rd:='f';
  elsif idpKind = 2 then -- средний род
    rd:='mdl';
  end if;

  loop
  --проверка для правильной работы логарифма
  if nvNumber>0 then
     --ближайшая степень кратная трем
     f := floor(floor(log(10, nvNumber))/3)*3;
     --первы
     maxi := floor(nvNumber/power(10,f));
     nvNumber := mod(nvNumber, power(10,f));
     --разложение на цифры
     ost100 := floor(maxi/100);
     ost10 := floor((maxi-ost100*100)/10);
     ost := maxi - ost100*100 - ost10*10;
     --сотни
     case ost100
          when 1 then result := result || ' сто';
          when 2 then result := result || ' двести';
          when 3 then result := result || ' триста';
          when 4 then result := result || ' четыреста';
          when 5 then result := result || ' пятьсот';
          when 6 then result := result || ' шестьсот';
          when 7 then result := result || ' семьсот';
          when 8 then result := result || ' восемьсот';
          when 9 then result := result || ' девятьсот';
          else null;
     end case;
     --десятки
     case ost10
          when 1 then
          begin
               -- от 10 до 19
               case ost
                    when 1 then result := result || ' одиннадцать';
                    when 2 then result := result || ' двенадцать';
                    when 3 then result := result || ' тринадцать';
                    when 4 then result := result || ' четырнадцать';
                    when 5 then result := result || ' пятнадцать';
                    when 6 then result := result || ' шестнадцать';
                    when 7 then result := result || ' семнадцать';
                    when 8 then result := result || ' восемнадцать';
                    when 9 then result := result || ' девятнадцать';
                    when 0 then result := result || ' десять';
               end case;
          end;
          when 2 then result := result || ' двадцать';
          when 3 then result := result || ' тридцать';
          when 4 then result := result || ' сорок';
          when 5 then result := result || ' пятьдесят';
          when 6 then result := result || ' шестьдесят';
          when 7 then result := result || ' семьдесят';
          when 8 then result := result || ' восемьдесят';
          when 9 then result := result || ' девяносто';
          when 0 then null;
     end case;
     -- единицы
     if ost10<>1 then
        case ost
             when 1 then
             begin
                  if f=3 then
                      result := result || ' одна';
                  else
                    if f=0 then
                    case rd
                      when 'm' then result := result || ' один';
                      when 'f' then result := result || ' одна';
                      when 'mdl' then result := result || ' одно';
                      else result := result || ' один';
                    end case;
                    else
                      result := result || ' один';
                    end if;
                  end if;
             end;
             when 2 then
             begin
                  if f=3 then
                      result := result || ' две';
                  else
                      if f=0 then
                      case rd
                           when 'm' then result := result || ' два';
                           when 'f' then result := result || ' две';
                           when 'mdl' then result := result || ' два';
                           else result := result || ' два';
                      end case;
                      else
                           result := result || ' два';
                      end if;
                  end if;
             end;
             when 3 then result := result || ' три';
             when 4 then result := result || ' четыре';
             when 5 then result := result || ' пять';
             when 6 then result := result || ' шесть';
             when 7 then result := result || ' семь';
             when 8 then result := result || ' восемь';
             when 9 then result := result || ' девять';
             when 0 then null;
        end case;
     end if;
  else
     exit;
  end if;

  if f>=36 then
    result := 'Слишком большое число!';
    exit;
  end if;

  if f>=6 and f<36 then
  case f
       when 33 then result := result || ' декалион';
       when 30 then result := result || ' ноналион';
       when 27 then result := result || ' окталион';
       when 24 then result := result || ' септилион';
       when 21 then result := result || ' секстилион';
       when 18 then result := result || ' квинтилион';
       when 15 then result := result || ' квадрилион';
       when 12 then result := result || ' трилион';
       when 9  then result := result || ' миллиард';
       when 6  then result := 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 result := result || 'ов';
        when ost=1 and ost10<>1 then null;
        when ost>=2 and ost<=4 and ost10<>1 then result := result || 'а';
  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 result := result || ' тысяч';
        when ost=1 and ost10<>1 then result := result || ' тысяча';
        when ost>=2 and ost<=4 and ost10<>1 then result := result || ' тысячи';
    end case;
  end if;

  f := f-3;
  exit when f<0;
  end loop;

  return result;

end NumberToStrRUS;
/

29 май 07, 16:37    [4200192]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить