No Oracle Database, você pode formatar números de várias maneiras.
Por exemplo, você pode formatar um número como moeda, com vírgulas e pontos decimais no lugar certo. Você pode especificar zeros à esquerda, pode adicionar uma parte fracionária – ou removê-la, se for necessário.
Este artigo contém exemplos do seguinte:
- Formatar números como moeda
- Adicione um separador de vírgula/milhar
- Incluir casas decimais
- Remover todas as casas decimais
- Adicionar zeros à esquerda a um número
Também explico como a formatação é afetada pelos parâmetros NLS da sua sessão.
Os parâmetros de inicialização NLS determinam quais caracteres são usados para o separador de grupo, caractere decimal e símbolo de moeda na sessão atual. Você pode aproveitar esses parâmetros para gerar formatação com reconhecimento de localidade.
Você pode usar funções como
TO_CHAR(number)
e até LPAD()
para converter números em uma string e formatá-los exatamente como você gosta em tempo real. Funções como CAST()
também pode afetar como um número é formatado, dependendo do tipo de dados para o qual ele está sendo convertido. Um exemplo rápido
Aqui está um exemplo rápido de formatação de um número usando o
TO_CHAR()
função:SELECT
TO_CHAR(12345, 'fmL99G999D00')
FROM DUAL;
Resultado:
$12,345.00
O
fmL99G999D00
part é um modelo de formato que determina como a saída deve ser formatada. Você pode alterar o modelo de formato para atender às suas necessidades. Cada caractere no modelo de formato é um elemento de formato e tem um significado especial. Você pode adicionar ou remover elementos de formato conforme necessário.
Aqui está uma lista completa de elementos de formato que você pode usar para seu modelo de formato ao formatar números.
Embora seja verdade que você pode fornecer um literal de string para vários elementos de formato (por exemplo, um cifrão (
$
) para dólares), isso pressupõe que a moeda seja denominada nesse valor codificado permanentemente. Existem muitas outras moedas possíveis em todo o mundo, e os elementos de formato são capazes de retornar dinamicamente o símbolo da moeda local para a sessão do usuário. É o mesmo para o separador de grupo e o caractere decimal. Diferentes localidades usam convenções diferentes. O uso desses elementos de formato com reconhecimento de localidade torna seu código mais portátil.
Além disso, o
TO_CHAR()
A função permite que você passe seus próprios parâmetros NLS dentro da função. Fazer isso afeta apenas essa chamada de função, para que você possa alterar coisas como símbolos de moeda em tempo real sem precisar codificá-lo em seu modelo de formato ou atualizar os parâmetros NLS para sua sessão. Os exemplos a seguir mostram como cada elemento de formato funciona com mais detalhes.
Formatar números como moeda
Aqui está um exemplo de formatação de um número como moeda:
SELECT
TO_CHAR(12, 'fmL99')
FROM DUAL;
Resultado:
$12
Neste caso, usei o
L
elemento de formato para especificar o símbolo da moeda local. O símbolo da moeda local é determinado pelo NLS_CURRENCY
parâmetro. Você também pode usar o
C
ou U
elementos de formato, que retornam o símbolo de moeda ISO e o símbolo de moeda dupla, respectivamente. Consulte Como formatar números como moeda no Oracle para obter mais informações e exemplos.
Adicionar um separador de vírgula/milhares
Embora você sempre possa usar uma vírgula codificada para seu separador de milhares/grupo, isso não leva em consideração os países que usam um ponto para o separador de grupo. O inverso é obviamente verdadeiro. Além disso, alguns países separam milhares de grupos com um espaço estreito.
Você pode usar o
G
elemento de formato para especificar um separador de grupo. Isso retorna dinamicamente o separador de grupo aplicável conforme especificado no NLS_NUMERIC_CHARACTERS
parâmetro. Este parâmetro determina o separador de grupo e o caractere decimal. Exemplo:
SELECT
TO_CHAR(12345, 'fm99G999')
FROM DUAL;
Resultado:
12,345
Aqui está outro exemplo com um número maior:
SELECT
TO_CHAR(123456789, 'fm999G999G999')
FROM DUAL;
Resultado:
123,456,789
Consulte Como formatar um número com vírgula no Oracle para uma discussão mais detalhada.
Incluir casas decimais
Embora seja verdade que você pode codificar seu próprio caractere radix (por exemplo, um ponto) em seu modelo de formato, isso não atenderá a outras localidades que usam um caractere diferente.
Você pode usar o
D
elemento de formato para retornar o caractere decimal/radix especificado no NLS_NUMERIC_CHARACTERS
parâmetro para a sessão atual:SELECT
TO_CHAR(7, 'fm9D00')
FROM DUAL;
Resultado:
7.00
Neste caso eu usei dois
0
elementos de formato após o caractere radix. Este elemento de formato retorna zeros à direita quando aplicável. Usando um
9
suprimiria quaisquer zeros à direita neste caso:SELECT
TO_CHAR(7, 'fm9D99')
FROM DUAL;
Resultado:
7.
No entanto, se removermos o
fm
modificador de formato, obtemos um resultado diferente:SELECT
TO_CHAR(7, '9D99')
FROM DUAL;
Resultado:
7.00
O
fm
O modificador de formato suprime qualquer preenchimento aplicado ao resultado. Ao removê-lo, nosso resultado é preenchido. Ele contém um espaço à esquerda, porque é para onde um sinal negativo teria ido se o número fosse negativo. E também contém zeros à direita, porque especificamos dois 9
elementos de formato. Consulte 3 maneiras de formatar um número com 2 casas decimais no Oracle para obter mais ideias sobre como formatar números com casas decimais.
Remover todas as casas decimais
Existem várias maneiras de formatar um número para não ter casas decimais. Uma maneira óbvia é simplesmente remover a parte decimal da nossa string de formato:
SELECT
TO_CHAR(7, 'fm9')
FROM DUAL;
Resultado:
7
Mas também podemos usar outras funções, como
ROUND()
, TRUNC()
e CAST()
para obter o mesmo efeito, ou similar. Consulte 4 maneiras de formatar um número sem decimais no Oracle para obter exemplos.
Adicionar zeros à esquerda
Temos algumas opções quando se trata de adicionar zeros à esquerda ao nosso número.
Novamente, mantendo o
TO_CHAR()
função, podemos usar o 0
elemento de formato para retornar zeros à esquerda e à direita. SELECT
TO_CHAR(7, 'fm000')
FROM DUAL;
Resultado:
007
Se tivéssemos usado o
9
elemento de formato, não teríamos nenhum zero à esquerda:SELECT
TO_CHAR(7, 'fm999')
FROM DUAL;
Resultado:
7
No entanto, se removermos o
fm
modificador de formato, teríamos um espaço onde qualquer zero à esquerda teria sido:SELECT
TO_CHAR(7, '999')
FROM DUAL;
Resultado:
7
Outra maneira de formatar um número com zeros à esquerda é com o
LPAD()
função. Esta função aplica o preenchimento esquerdo a uma string ou número. Você pode especificar quais caracteres usar para o preenchimento e, portanto, se você usar um zero, ele será preenchido com zeros. Consulte 2 maneiras de formatar um número com zeros à esquerda no Oracle para obter um exemplo.
Como verificar os parâmetros NLS
Os parâmetros NLS (National Language Support) determinam o comportamento específico da localidade no cliente e no servidor. Isso inclui parâmetros que determinam quais caracteres usar para o separador de grupo, caractere decimal, símbolos de moeda etc.
Vamos verificar o valor atual dos meus parâmetros NLS:
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS;
Resultado:
PARAMETER VALUE __________________________ _________________________________ NLS_LANGUAGE ENGLISH NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_NUMERIC_CHARACTERS ., NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD/MON/RR NLS_DATE_LANGUAGE ENGLISH NLS_CHARACTERSET AL32UTF8 NLS_SORT BINARY NLS_TIME_FORMAT HH12:MI:SSXFF AM NLS_TIMESTAMP_FORMAT DD/MON/RR HH12:MI:SSXFF AM NLS_TIME_TZ_FORMAT HH12:MI:SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD/MON/RR HH12:MI:SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE
Os parâmetros a seguir determinam os elementos de formatação para números e moedas:
NLS_CURRENCY
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_DUAL_CURRENCY
O valor padrão desses parâmetros é determinado pelo
NLS_TERRITORY
parâmetro. Quando definimos o valor do NLS_TERRITORY
parâmetro, isso define implicitamente o valor para vários outros parâmetros (incluindo os quatro mencionados). No meu caso, meu território é a Austrália e, portanto, esses quatro parâmetros refletem como os números são normalmente formatados na Austrália. Se eu mudasse para Alemanha, esses quatro parâmetros seriam atualizados para refletir a formatação da Alemanha.
No entanto, você pode definir explicitamente cada parâmetro individualmente. Isso permite que você substitua o valor que foi definido implicitamente pelo
NLS_TERRITORY
parâmetro.