Número por Extenso

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
jctq
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 27
Registrado em: Qua, 08 Fev 2006 1:21 pm
Localização: São Gonçalo
Att,
Julio Quintão

Srs.,

Boa tarde, gostaria de saber se alguém sabe uma função simples para gerar um extenso de um numero.

Muito Obrigado.

JCTQ :roll:
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Olá jctq

Veja esse tópico:
http://www.glufke.net/oracle/viewtopic.php?t=36

Sempre antes de perguntar no forum lembre-se de pesquisar, pois provavelmente alguém já teve uma dúvida igual.

Essa é a vantagem em relação a LISTAS de EMAIL: no forum temos um histórico / base de conhecimento!!!
bertosro
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 88
Registrado em: Sex, 18 Ago 2006 11:13 am
Localização: São Paulo - SP
Bertosro
MSN / TALK - roberto.fernandes@gmail.com

Selecionar tudo

-- Start of DDL Script for Function CTMS.FRT_EXTENSO_MONETARIO
-- Generated 18-out-2006 16:19:18 from CTMS@CTMS

CREATE OR REPLACE 
FUNCTION frt_extenso_monetario( VALOR NUMBER )
RETURN VARCHAR2
IS
/* 
VERSAO       : 1.1
OBJETIVO     : CONVERTER NUMENROS EM EXTENSO MONETARIO
DESENVOLVEDOR: ROBERTO FERNANDES SOBRINHO
ALTERACOES    :
*/
VALOR_STRING    VARCHAR2(256);
VALOR_CONV      VARCHAR2(25);
IND             NUMBER;
TRES_DIGITOS    VARCHAR2(3);
TEXTO_STRING    VARCHAR2(256);
BEGIN
  VALOR_CONV := TO_CHAR( TRUNC((ABS(VALOR) * 100),0) , '0999999999999999999' );
  VALOR_CONV := SUBSTR( VALOR_CONV , 1 , 18 ) || '0' || SUBSTR( VALOR_CONV , 19, 2 );
  IF TO_NUMBER(VALOR_CONV) = 0 THEN
    RETURN('ZERO');
  END IF;
  FOR IND IN 1..7 LOOP
    TRES_DIGITOS := SUBSTR( VALOR_CONV , (((IND-1)*3)+1) , 3 );
    TEXTO_STRING := '' ;
    -- EXTENSO PARA CENTENA
    IF SUBSTR(TRES_DIGITOS,1,1) = '2' THEN
      TEXTO_STRING := TEXTO_STRING || 'DUZENTOS ' ;
    ELSIF SUBSTR(TRES_DIGITOS,1,1) = '3' THEN
      TEXTO_STRING := TEXTO_STRING || 'TREZENTOS ' ;
    ELSIF SUBSTR(TRES_DIGITOS,1,1) = '4' THEN
      TEXTO_STRING := TEXTO_STRING || 'QUATROCENTOS ' ;
    ELSIF SUBSTR(TRES_DIGITOS,1,1) = '5' THEN
      TEXTO_STRING := TEXTO_STRING || 'QUINHENTOS ' ;
    ELSIF SUBSTR(TRES_DIGITOS,1,1) = '6' THEN
      TEXTO_STRING := TEXTO_STRING || 'SEISCENTOS ' ;
    ELSIF SUBSTR(TRES_DIGITOS,1,1) = '7' THEN
      TEXTO_STRING := TEXTO_STRING || 'SETECENTOS ' ;
    ELSIF SUBSTR(TRES_DIGITOS,1,1) = '8' THEN
      TEXTO_STRING := TEXTO_STRING || 'OITOCENTOS ' ;
    ELSIF SUBSTR(TRES_DIGITOS,1,1) = '9' THEN
      TEXTO_STRING := TEXTO_STRING || 'NOVECENTOS ' ;
    END IF;
    IF SUBSTR(TRES_DIGITOS,1,1) = '1' THEN
      IF SUBSTR(TRES_DIGITOS,2,2) = '00' THEN
        TEXTO_STRING := TEXTO_STRING || 'CEM ' ;
      ELSE
        TEXTO_STRING := TEXTO_STRING || 'CENTO ' ;
      END IF;
    END IF;
    -- EXTENSO PARA DEZENA
    IF SUBSTR(TRES_DIGITOS,2,1) <> '0' AND TEXTO_STRING IS NOT NULL THEN
      TEXTO_STRING := TEXTO_STRING || 'E ';
    END IF;
    IF SUBSTR(TRES_DIGITOS,2,1) = '2' THEN
      TEXTO_STRING := TEXTO_STRING ||'VINTE ';
    ELSIF SUBSTR(TRES_DIGITOS,2,1) = '3' THEN
      TEXTO_STRING := TEXTO_STRING ||'TRINTA ';
    ELSIF SUBSTR(TRES_DIGITOS,2,1) = '4' THEN
      TEXTO_STRING := TEXTO_STRING ||'QUARENTA ';
    ELSIF SUBSTR(TRES_DIGITOS,2,1) = '5' THEN
      TEXTO_STRING := TEXTO_STRING ||'CINQUENTA ';
    ELSIF SUBSTR(TRES_DIGITOS,2,1) = '6' THEN
      TEXTO_STRING := TEXTO_STRING ||'SESSENTA ';
    ELSIF SUBSTR(TRES_DIGITOS,2,1) = '7' THEN
      TEXTO_STRING := TEXTO_STRING ||'SETENTA ';
    ELSIF SUBSTR(TRES_DIGITOS,2,1) = '8' THEN
      TEXTO_STRING := TEXTO_STRING ||'OITENTA ';
    ELSIF SUBSTR(TRES_DIGITOS,2,1) = '9' THEN
      TEXTO_STRING := TEXTO_STRING ||'NOVENTA ';
    END IF;
    IF SUBSTR(TRES_DIGITOS,2,1) = '1' THEN
      IF SUBSTR(TRES_DIGITOS,3,1) <> '0' THEN
        IF SUBSTR(TRES_DIGITOS,3,1) = '1' THEN
          TEXTO_STRING := TEXTO_STRING ||'ONZE ';
        ELSIF SUBSTR(TRES_DIGITOS,3,1) = '2' THEN
          TEXTO_STRING := TEXTO_STRING ||'DOZE ';
        ELSIF SUBSTR(TRES_DIGITOS,3,1) = '3' THEN
          TEXTO_STRING := TEXTO_STRING ||'TREZE ';
        ELSIF SUBSTR(TRES_DIGITOS,3,1) = '4' THEN
          TEXTO_STRING := TEXTO_STRING ||'CATORZE ';
        ELSIF SUBSTR(TRES_DIGITOS,3,1) = '5' THEN
          TEXTO_STRING := TEXTO_STRING ||'QUINZE ';
        ELSIF SUBSTR(TRES_DIGITOS,3,1) = '6' THEN
          TEXTO_STRING := TEXTO_STRING ||'DEZESSEIS ';
        ELSIF SUBSTR(TRES_DIGITOS,3,1) = '7' THEN
          TEXTO_STRING := TEXTO_STRING ||'DEZESSETE ';
        ELSIF SUBSTR(TRES_DIGITOS,3,1) = '8' THEN
          TEXTO_STRING := TEXTO_STRING ||'DEZOITO ';
        ELSIF SUBSTR(TRES_DIGITOS,3,1) = '9' THEN
          TEXTO_STRING := TEXTO_STRING ||'DEZENOVE ';
        END IF;
      ELSE
        TEXTO_STRING := TEXTO_STRING ||'DEZ ' ;
      END IF;
    ELSE
    -- EXTENSO PARA UNIDADE
      IF SUBSTR(TRES_DIGITOS,3,1) <> '0' AND TEXTO_STRING IS NOT NULL THEN
        TEXTO_STRING := TEXTO_STRING || 'E ';
      END IF;
      IF SUBSTR(TRES_DIGITOS,3,1) = '1' THEN
        TEXTO_STRING := TEXTO_STRING ||'UM ';
      ELSIF SUBSTR(TRES_DIGITOS,3,1) = '2' THEN
        TEXTO_STRING := TEXTO_STRING ||'DOIS ';
      ELSIF SUBSTR(TRES_DIGITOS,3,1) = '3' THEN
        TEXTO_STRING := TEXTO_STRING ||'TRES ';
      ELSIF SUBSTR(TRES_DIGITOS,3,1) = '4' THEN
        TEXTO_STRING := TEXTO_STRING ||'QUATRO ';
      ELSIF SUBSTR(TRES_DIGITOS,3,1) = '5' THEN
        TEXTO_STRING := TEXTO_STRING ||'CINCO ';
      ELSIF SUBSTR(TRES_DIGITOS,3,1) = '6' THEN
        TEXTO_STRING := TEXTO_STRING ||'SEIS ';
      ELSIF SUBSTR(TRES_DIGITOS,3,1) = '7' THEN
        TEXTO_STRING := TEXTO_STRING ||'SETE ';
      ELSIF SUBSTR(TRES_DIGITOS,3,1) = '8' THEN
        TEXTO_STRING := TEXTO_STRING ||'OITO ';
      ELSIF SUBSTR(TRES_DIGITOS,3,1) = '9' THEN
        TEXTO_STRING := TEXTO_STRING ||'NOVE ';
      END IF;
    END IF;
    IF TO_NUMBER( TRES_DIGITOS ) > 0 THEN
      IF TO_NUMBER( TRES_DIGITOS ) = 1 THEN
        IF IND = 1 THEN
          TEXTO_STRING := TEXTO_STRING || 'QUATRILHÃO ' ;
        ELSIF IND = 2 THEN
          TEXTO_STRING := TEXTO_STRING || 'TRILHÃO ' ;
        ELSIF IND = 3 THEN
          TEXTO_STRING := TEXTO_STRING || 'BILHÃO ' ;
        ELSIF IND = 4 THEN
          TEXTO_STRING := TEXTO_STRING || 'MILHÃO ' ;
        ELSIF IND = 5 THEN
          TEXTO_STRING := TEXTO_STRING || 'MIL ' ;
        END IF;
      ELSE
        IF IND = 1 THEN
          TEXTO_STRING := TEXTO_STRING || 'QUATRILHÕES ' ;
        ELSIF IND = 2 THEN
          TEXTO_STRING := TEXTO_STRING || 'TRILHÕES ' ;
        ELSIF IND = 3 THEN
          TEXTO_STRING := TEXTO_STRING || 'BILHÕES ' ;
        ELSIF IND = 4 THEN
          TEXTO_STRING := TEXTO_STRING || 'MILHÕES ' ;
        ELSIF IND = 5 THEN
          TEXTO_STRING := TEXTO_STRING || 'MIL ' ;
        END IF;
      END IF;
    END IF;
    VALOR_STRING := VALOR_STRING || TEXTO_STRING;
    -- ESCRITA DA MOEDA CORRENTE
    IF IND = 5 THEN
      IF TO_NUMBER( SUBSTR( VALOR_CONV , 16 , 3 )) > 0 AND VALOR_STRING IS
          NOT NULL THEN
        VALOR_STRING := RTRIM(VALOR_STRING) || ', ';
      END IF;
    ELSE
      IF IND < 5 AND VALOR_STRING IS NOT NULL THEN
        VALOR_STRING := RTRIM(VALOR_STRING) || ', ';
      END IF;
    END IF;
    IF IND = 6 THEN
      IF TO_NUMBER( SUBSTR( VALOR_CONV , 1 , 18 ) ) > 1 THEN
        VALOR_STRING := VALOR_STRING || 'REAIS ';
      ELSIF TO_NUMBER( SUBSTR( VALOR_CONV , 1 , 18 ) ) = 1 THEN
        VALOR_STRING := VALOR_STRING || 'REAL ';
      END IF;

      IF TO_NUMBER( SUBSTR( VALOR_CONV , 20 , 2 ) ) > 0 AND
           LENGTH(VALOR_STRING) > 0  THEN
        VALOR_STRING := VALOR_STRING || 'E ';
      END IF;
    END IF;
    -- ESCRITA PARA CENTAVOS
    IF IND = 7 THEN
      IF TO_NUMBER( SUBSTR( VALOR_CONV , 20 , 2 ) ) > 1 THEN
        VALOR_STRING := VALOR_STRING  || 'CENTAVOS ';
      ELSIF TO_NUMBER( SUBSTR( VALOR_CONV , 20 , 2 ) ) = 1 THEN
        VALOR_STRING := VALOR_STRING  || 'CENTAVO ';
      END IF;
    END IF;
  END LOOP;
  RETURN( RTRIM(VALOR_STRING) );
EXCEPTION
  WHEN OTHERS THEN
    RETURN( '*** VALOR INVALIDO ***' );
END;
/



-- End of DDL Script for Function CTMS.FRT_EXTENSO_MONETARIO
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes