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é 🙂

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *