none
Function numeros. RRS feed

  • Pergunta

  • Boa Tarde!!!

    Gostaria de fazer uma function que transformasse numeros em extenso.

    Por exemplo:

    Rua 25 de Março => Rua Vinte e cinco de Março.


    Alguém pode me ajudar?


    Maurício

     
    segunda-feira, 16 de fevereiro de 2009 16:22

Todas as Respostas

  • da uma olhada nesta, acho que pode ajudar dai e so adaptar para seu caso.


    select dbo.ufncExtenso(150)

    CREATE FUNCTION dbo.ufncExtenso(
     @VALOR DECIMAL(18, 5)
    )
    RETURNS VARCHAR(255)

    AS

    BEGIN


    DECLARE @STR_EXT       VARCHAR(255),
     @FLAG_E        INT,
     @GRUPO         DECIMAL(10, 2),
     @MOEDA         VARCHAR(10),
     @MOEDA_PLURAL  VARCHAR(10),
     @FLAG_CENTAVOS DECIMAL(18, 5),
     @TEMPINT BIGINT


    -- Aqui vc podera configurar a descricao da Moeda
    SET @MOEDA         = 'Real'
    SET @MOEDA_PLURAL  = 'Reais'
    SET @FLAG_CENTAVOS = 1 -- Exibir os centavos [ 0) Nao 1) Sim ]


    SET @STR_EXT = ''
    SET @FLAG_E  = 0
    SET @GRUPO   = 0

    IF(@VALOR < 0)
    BEGIN
     SET @STR_EXT = 'Menos'
     SET @VALOR = ABS(@VALOR)
    END

    --IF ((CONVERT(INT, @VALOR) - (CONVERT(INT, @VALOR) % 1)) = 0) BEGIN
    IF (CONVERT(INT, @VALOR) = 0) BEGIN
     SET @STR_EXT = ' Zero'
    END
    ELSE
    BEGIN
     --      SET @TEMPINT = (.000000001*((CONVERT(BIGINT, @VALOR) % 1000000000000) - (CONVERT(BIGINT, @VALOR) % 1000000000)))
     --      SELECT @FLAG_E = FLAG_E, @STR_EXT = STR_EXT
     -- FROM dbo.TrataGrupoExtenso(
     -- @TEMPINT, ' Bilhao', ' Bilhoes', @FLAG_E, @STR_EXT)

     SET @TEMPINT = .000001*((CONVERT(INT, @VALOR) % 1000000000) - (CONVERT(INT, @VALOR) % 1000000))

     SELECT @FLAG_E = FLAG_E,
      @STR_EXT = STR_EXT
     FROM dbo.fncTrataGrupoExtenso(@TEMPINT, ' Milhao' , ' Milhoes', @FLAG_E, @STR_EXT)

     SET @TEMPINT = .001*((CONVERT(INT, @VALOR) % 1000000) - (CONVERT(INT, @VALOR) % 1000))

     SELECT @FLAG_E = FLAG_E,
      @STR_EXT = STR_EXT
     FROM dbo.fncTrataGrupoExtenso(@TEMPINT, ' Mil' , ' Mil', @FLAG_E, @STR_EXT)

     SET @TEMPINT = (CONVERT(INT, @VALOR) % 1000)

     SELECT @FLAG_E = FLAG_E, @STR_EXT = STR_EXT
     FROM dbo.fncTrataGrupoExtenso(@TEMPINT, '' , '', @FLAG_E, @STR_EXT)
    END


    IF (ROUND(@VALOR, 0) = 1) BEGIN
     SET @STR_EXT = @STR_EXT + ' '+RTRIM(@MOEDA)
    END
    ELSE
    BEGIN
     IF (ROUND(@VALOR, -6) <> 0) and (ROUND(@VALOR, 0) - ROUND(@VALOR, -6) = 0)
      SET @STR_EXT = @STR_EXT + ' de ' + RTRIM(@moeda_plural)
     ELSE
      SET @STR_EXT = @STR_EXT + ' ' + RTRIM(@moeda_plural)
    END

    IF (@FLAG_CENTAVOS = 1) BEGIN
     SET @FLAG_E = 1;

     SET @TEMPINT = 100*(@VALOR - CONVERT(INT, @Valor) )--ROUND(@VALOR, 0))
     
     -- Aqui vc podera mudar a descricao dos centavos
     SELECT @FLAG_E = FLAG_E,
      @STR_EXT = STR_EXT
     FROM dbo.fncTrataGrupoExtenso(@TEMPINT, ' centavo' , ' centavos', @FLAG_E, @STR_EXT)
    END


    RETURN(@STR_EXT)

    END








    mcolla@bol.com.br
    segunda-feira, 16 de fevereiro de 2009 16:42
  • Olá,

    Você terá que desenvolver esta função. Eu não tenho nenhuma pronta em T-SQL, vamos ver se algum colega daqui já fez algo parecido e pode compartilhar.

    Mas jogue no Google "função número por extenso". Você encontrará uma série de exemplos de funções em VBA, VB e C#, Pl/SQL. Pegue uma delas e use a mesma lógica para criar uma em T-SQL.

    Um abraço,
    Raul Santos Neto
    segunda-feira, 16 de fevereiro de 2009 16:42
  • Olá!!!
     
    Eu estou pesquisando, se alguém tiver alguma eu agradeço.



    Muito Obrigado!!!
    segunda-feira, 16 de fevereiro de 2009 16:55
  • Maumauboy,

    O exemplo do Colla não ajudou?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 17 de fevereiro de 2009 02:28
  • Bom Dia
     


    O exemplo dele é muito bom, acontece que ainda não consegui concluir, quando o ecemplo dele passa de mil, a function nao retorna os valores corretos.

    Gostaria de uma ajuda.


    Aguardo Retorno

    Maurício 
    quarta-feira, 18 de fevereiro de 2009 12:20
  • Maumauboy,

    Veja se este exemplo ajuda:

    1 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Monetario_Nivel1_RetornoValorPorExtenso]'and OBJECTPROPERTY(id, N'IsProcedure') = 1)  
    2 drop procedure [dbo].[Monetario_Nivel1_RetornoValorPorExtenso]  
    3 GO  
    4  
    5 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Monetario_RetornoValorPorExtenso]'and OBJECTPROPERTY(id, N'IsProcedure') = 1)  
    6 drop procedure [dbo].[Monetario_RetornoValorPorExtenso]  
    7 GO  
    8  
    9 SET QUOTED_IDENTIFIER OFF   
    10 GO  
    11 SET ANSI_NULLS OFF   
    12 GO  
    13  
    14  
    15 CREATE PROCEDURE [Monetario_Nivel1_RetornoValorPorExtenso]   
    16  
    17 @valor_numerico as varchar(3),  
    18 @valor_porextenso as varchar(100) out 
    19  
    20 AS 
    21  
    22 declare @valor_len as int 
    23 declare @unidade as varchar(50)  
    24 declare @dezena as varchar(50)  
    25 declare @centena as varchar(50)  
    26  
    27 set @valor_len = len(@valor_numerico)  
    28  
    29 if( right(@valor_numerico,1) between 1 and 9 )   
    30 begin 
    31    select @unidade = case right(@valor_numerico,1)  
    32    when 1 then 'Um' 
    33    when 2 then 'Dois' 
    34    when 3 then 'Três' 
    35    when 4 then 'Quatro' 
    36    when 5 then 'Cinco' 
    37    when 6 then 'Seis' 
    38    when 7 then 'Sete' 
    39    when 8 then 'Oito' 
    40    when 9 then 'Nove' 
    41    end 
    42 end 
    43  
    44 if( right(@valor_numerico,2) between 10 and 19 )   
    45 begin 
    46    select @unidade = case right(@valor_numerico,2)  
    47    when 10 then 'Dez' 
    48    when 11 then 'Onze' 
    49    when 12 then 'Doze' 
    50    when 13 then 'Treze' 
    51    when 14 then 'Quatorze' 
    52    when 15 then 'Quinze' 
    53    when 16 then 'Dezesseis' 
    54    when 17 then 'Dezessete' 
    55    when 18 then 'Dezoito' 
    56    when 19 then 'Dezenove' 
    57    end 
    58 end 
    59  
    60 if( len(@valor_numerico) >= 2 and cast(right(@valor_numerico,2) as char(1)) between 2 and 9 )  
    61 begin 
    62    select @dezena = case cast(right(@valor_numerico,2) as char(1))  
    63    when 2 then 'Vinte' 
    64    when 3 then 'Trinta' 
    65    when 4 then 'Quarenta' 
    66    when 5 then 'Cinquenta' 
    67    when 6 then 'Sessenta' 
    68    when 7 then 'Setenta' 
    69    when 8 then 'Oitenta' 
    70    when 9 then 'Noventa' 
    71    end 
    72 end 
    73  
    74 if( len(@valor_numerico) = 3 and cast(right(@valor_numerico,3) as char(1)) between 1 and 9 )  
    75 begin 
    76    select @centena = case cast(right(@valor_numerico,3) as char(1))  
    77    when 1 then 'Cento' 
    78    when 2 then 'Duzentos' 
    79    when 3 then 'Trezentos' 
    80    when 4 then 'Quatrocentos' 
    81    when 5 then 'Quinhentos' 
    82    when 6 then 'Seiscentos' 
    83    when 7 then 'Setecentos' 
    84    when 8 then 'Oitocentos' 
    85    when 9 then 'Novecentos' 
    86    end 
    87 end 
    88  
    89 if @unidade is not null 
    90    set @valor_porextenso = @unidade  
    91  
    92 if @dezena is not null and @unidade is null 
    93    set @valor_porextenso = @dezena  
    94 else if @dezena is not null and @unidade is not null 
    95    set @valor_porextenso = @dezena + ' e ' + @unidade  
    96  
    97 if @centena is not null 
    98 begin 
    99    set @valor_porextenso = @centena  
    100    if @dezena is not null and @unidade is null 
    101       set @valor_porextenso = @centena + ' e ' + @dezena  
    102    else if @dezena is not null and @unidade is not null 
    103       set @valor_porextenso = @centena + ' e ' + @dezena + ' e ' + @unidade  
    104    else if @dezena is null and @unidade is not null 
    105       set @valor_porextenso = @centena + ' e ' + @unidade  
    106    if( @valor_porextenso = 'Cento' )  
    107       set @valor_porextenso = 'Cem' 
    108 end 
    109  
    110 GO  
    111 SET QUOTED_IDENTIFIER OFF   
    112 GO  
    113 SET ANSI_NULLS ON   
    114 GO  
    115  
    116 SET QUOTED_IDENTIFIER OFF   
    117 GO  
    118 SET ANSI_NULLS OFF   
    119 GO  
    120  
    121  
    122 CREATE PROCEDURE [Monetario_RetornoValorPorExtenso]   
    123  
    124 @valor_numerico as varchar(100),            --FORMATO: 1.123,00  
    125 @valor_porextenso_completo as varchar(500) out 
    126  
    127 AS 
    128  
    129 if @valor_numerico is null 
    130    return 1  
    131 if @valor_numerico = '' 
    132    return 2  
    133  
    134 declare @valor_numerico_tmp as varchar(100)  
    135 declare @valor_numerico_spt as varchar(100)  
    136 declare @valor_num_inter as varchar(100)  
    137 declare @valor_num_cent as varchar(100)  
    138 declare @valor_porextenso as varchar(500)  
    139 declare @index as int 
    140 declare @final as int 
    141 declare @x as int 
    142  
    143 -- separa valor inteiro e centavo.  
    144 set @valor_num_inter = replaceleft(@valor_numerico,len(@valor_numerico)-2), ',' , '.' )  
    145 set @valor_num_cent = right( @valor_numerico, 2 )  
    146 set @valor_numerico_tmp = @valor_num_inter  
    147 set @x = 0  
    148 set @index = 0  
    149  
    150 /*   
    151 looping para gerar o valor por extenso de cada parte do valor inteiro;   
    152 exemplo: 123.456.  
    153 executa primeiro para 123 em seguida para 456.  
    154 */  
    155 while( 0 = 0 )  
    156 begin 
    157    set @valor_numerico_tmp = right( @valor_numerico_tmp, len( @valor_numerico_tmp ) - @index )  
    158    set @index = charindex( '.', @valor_numerico_tmp )  
    159    if( @index < 1 ) break  
    160    set @final = charindex( '.', @valor_numerico_tmp ) - 1  
    161    set @valor_numerico_spt = substring( @valor_numerico_tmp, 1, @final )  
    162  
    163    exec Monetario_Nivel1_RetornoValorPorExtenso @valor_numerico_spt, @valor_porextenso out 
    164  
    165    set @x = @x + 1  
    166    if( len(@valor_num_inter) < 5 )  
    167    begin 
    168       if( @x = 1 )  
    169          set @valor_porextenso_completo = @valor_porextenso  
    170    end 
    171  
    172    if( len(@valor_num_inter) between 5 and 9 )  
    173    begin 
    174       if( @x = 1 )  
    175          set @valor_porextenso_completo = @valor_porextenso + ' Mil' 
    176       if( @x = 2 )  
    177          set @valor_porextenso_completo = @valor_porextenso_completo + ' ' + @valor_porextenso   
    178    end 
    179  
    180    if( len(@valor_num_inter) > 9 )  
    181    begin 
    182       if( @x = 1 )  
    183       begin        
    184          if( cast(@valor_numerico_spt as int) > 1 )  
    185            set @valor_porextenso_completo = @valor_porextenso + ' Milhões ' 
    186          else 
    187            set @valor_porextenso_completo = @valor_porextenso + ' Milhão ' 
    188       end 
    189       if( @x = 2 )  
    190          set @valor_porextenso_completo = @valor_porextenso_completo + @valor_porextenso + ' Mil'   
    191       if( @x = 3 )  
    192          set @valor_porextenso_completo = @valor_porextenso_completo + ' ' + @valor_porextenso   
    193    end 
    194 end 
    195  
    196 set @valor_porextenso_completo = @valor_porextenso_completo + ' Reais' 
    197  
    198 if( @valor_num_cent > 0 )  
    199 begin 
    200    exec Monetario_Nivel1_RetornoValorPorExtenso @valor_num_cent, @valor_porextenso out 
    201    if( @valor_num_cent > 1 )  
    202       set @valor_porextenso_completo = @valor_porextenso_completo + ' e ' + @valor_porextenso + ' Centavos' 
    203    else 
    204       set @valor_porextenso_completo = @valor_porextenso_completo + ' e ' + @valor_porextenso + ' Centavo' 
    205 end 
    206 GO  
    207 SET QUOTED_IDENTIFIER OFF   
    208 GO  
    209 SET ANSI_NULLS ON   
    210 GO  
    211  
    212  
    213  
    214 declare @valor_numerico as varchar(100)  
    215 declare @valor_porextenso as varchar(500)  
    216  
    217 set @valor_numerico = '19.256,02' 
    218  
    219 exec Monetario_RetornoValorPorExtenso @valor_numerico, @valor_porextenso out 
    220  
    221 print 'R$' + @valor_numerico + ' (' + @valor_porextenso + ')' 

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    • Marcado como Resposta maumauboy sexta-feira, 20 de fevereiro de 2009 21:06
    • Não Marcado como Resposta maumauboy sexta-feira, 20 de fevereiro de 2009 21:06
    quarta-feira, 18 de fevereiro de 2009 13:14
  • Boa Tarde

    Não desejo valores monetários por extenso e nem decimais, gostaria de uma function que transformasse  "Rua 25 de março" em
    Rua Vinte e cinco de março.


    Aguardo Retorno

    Maurício
    quarta-feira, 18 de fevereiro de 2009 18:58