Inquiridor
Function numeros.

Pergunta
-
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 = 0IF(@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)
ENDIF (@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 -
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 -
-
-
-
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 = replace( left(@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 -