Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como formatar números no Oracle


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.