Oi! Seja bem-vindo!
Hoje aprenderemos a formatar moedas (dinheiro) no SQL Server! Para isso montei 3 exemplos distintos, incluindo a função format, uma função 100% SQL e uma CLR em C#!
Como formatar moedas no SQL Server
Formatar moedas: Script SQL
<span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span> ------------------------------------------------------------------ -- Formatar moedas (currency) no SQL ------------------------------------------------------------------ -------------------------------------------------- -- Requisitos para nosso teste -------------------------------------------------- -- Banco de testes use master if db_id('curso') is not null drop database curso go create database curso go use curso go -- Tabela de testes create table colaboradores (id smallint identity(1,1), nome varchar(200), salario money) insert into colaboradores (nome, salario) values ('João', 20000), ('Maria', 20000), ('José', 20000) go -- Mostrando dados: select * from colaboradores -------------------------------------------------- -- Formatando moedas (SQL2012+) -------------------------------------------------- select format (12345678.90, 'c', 'en-us') as 'en-us', format (12345678.90, 'c', 'pt-br') as 'pt-br' go select nome, format(salario, 'c', 'pt-br') as salario from colaboradores go -------------------------------------------------- -- Formatando moedas (SQL2012-): SQL Function -------------------------------------------------- -- Formatando com convert (o valor de entrada precisa ser do tipo money) select convert(varchar, convert(money, 12345678.90) ) as convert_normal, convert(varchar, convert(money, 12345678.90), 1) as convert_1 -- Usando FC com tratamento de região/cultura if object_id('converter_moeda') is not null drop function converter_moeda go create function converter_moeda (@valor as money, @cultura as nvarchar(5)) returns nvarchar(40) as begin return ( select case @cultura when 'pt-br' then 'R$ ' + replace(replace(replace( convert(nvarchar, @valor, 1), --converte para o formato "moeda americana" '.', '|'), -- substitui . por | somente para separar o inteiro das casas decimais ',', '.'), -- substitui , por . (separador de milhar no brasil) '|', ',') -- substitui | por , (separador de decimais) when 'en-gb' then '£' + convert(nvarchar, @valor, 1) -- United Kingdom when 'en-us' then '$' + convert(nvarchar, @valor, 1) -- us when 'de-de' then replace(replace(replace(convert(nvarchar, @valor, 1),'.', '|'), ',', '.'), '|', ',') + ' €' -- german when 'ja-jp' then '¥' + convert(nvarchar, @valor, 1) else '$ ' + convert(nvarchar, @valor, 1) -- us (padrão) end ) end go -- Comparando FCs select c.cultura, dbo.converter_moeda(12345678.90, c.cultura) funcao_manual, format (12345678.90, 'c', c.cultura) funcao_do_sql from (values ('pt-br'), ('en-gb'), ('en-us'), ('de-de'), ('ja-jp')) c(cultura) -------------------------------------------------- -- Formatando moedas (SQL2012-): SQL CLR -------------------------------------------------- -- Ativar CLR no SQL execute sp_configure 'show advanced options',1 reconfigure execute sp_configure 'clr enabled', 1 reconfigure go -- Compilar o assembly c# -- C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc /nologo /target:library /out:format.dll format.cs -- Cria assembly que referencia a DLL if object_id('clr_format') is not null drop function clr_format if exists (select 1 from sys.assemblies where name = 'format') drop assembly format create assembly format from 'c:\tmp\format.dll' with permission_set = safe go -- Cria função que referencia o assembly create function clr_format(@valor money, @cultura nvarchar(5)) returns nvarchar(50) as external name format.format.formata_moeda go -- Usando a fc select dbo.clr_format(12345678.90, 'en-us') as 'en-us', dbo.clr_format(12345678.90, 'pt-br') as 'pt-br', dbo.clr_format(12345678.90, 'en-gb') as 'en-gb' go -------------------------------------------------- -- Excluindo dados de teste -------------------------------------------------- use master drop database curso -------------------------------------------------- -- HELP: -------------------------------------------------- -- Culturas disponíveis: https://msdn.microsoft.com/en-us/library/hh441729.aspx
Formatar Moedas: Código C# usado na CLR
// // Classe para formato de moedas - CLR para SQL Server 2016 // Desenvolvida por Josué Viana - https://dba-pro.com - em 12/2017 // Licença de uso GNU (para usar é preciso mensionar a fonte/autor) // using System; //sql using System.Data; using System.Data.SqlClient; using Microsoft.SqlServer.Server; using System.Data.SqlTypes; //culture using System.Globalization; public class format { [SqlFunction( DataAccess=DataAccessKind.None, SystemDataAccess=SystemDataAccessKind.None, IsDeterministic=true, IsPrecise=true)] public static string formata_moeda(decimal valor, string cultura) { return valor.ToString("C", CultureInfo.CreateSpecificCulture(cultura)); } }
CONCLUSÃO
E incrível ver como a Microsoft vem evoluindo o SQL Server. Você poderia imaginar que a função “format” só viria no SQL2012? Demorou, mas chegou, aliás, em termos de programação, talvez essa tenha sido uma das versões que mais inovou.
Funções de ranking e funções analíticas também são minhas favoritas!! Vamos ver agora o SQL2017!!
Espero que tenha gostado do artigo, nos vemos no próximo! Abraço do seu amigo Josué 🙂