Oracle
 sql >> Database >  >> RDS >> Oracle

Come formattare i numeri in Oracle

In Oracle Database, puoi formattare i numeri in molti modi.

Ad esempio, puoi formattare un numero come valuta, con virgole e punti decimali al posto giusto. Puoi specificare zeri iniziali, aggiungere una parte frazionaria o rimuoverla, se è necessario.

Questo articolo contiene esempi di quanto segue:

  • Formatta i numeri come valuta
  • Aggiungi un separatore virgola/migliaia
  • Includi cifre decimali
  • Rimuovi tutte le cifre decimali
  • Aggiungi zeri iniziali a un numero

Spiego anche come la formattazione è influenzata dai parametri NLS della tua sessione.

I parametri di inizializzazione NLS determinano quali caratteri vengono utilizzati per il separatore di gruppo, il carattere decimale e il simbolo di valuta nella sessione corrente. Puoi sfruttare questi parametri per generare una formattazione compatibile con le impostazioni locali.

Puoi utilizzare funzioni come TO_CHAR(number) e persino LPAD() per convertire i numeri in una stringa e formattarli esattamente come preferisci al volo. Funziona come CAST() può anche avere un effetto sulla formattazione di un numero, a seconda del tipo di dati con cui viene trasmesso.

Un rapido esempio

Ecco un rapido esempio di formattazione di un numero utilizzando TO_CHAR() funzione:

SELECT 
    TO_CHAR(12345, 'fmL99G999D00')
FROM DUAL;

Risultato:

$12,345.00

Il fmL99G999D00 part è un modello di formato che determina come formattare l'output. È possibile modificare il modello di formato in base alle proprie esigenze.

Ogni carattere nel modello di formato è un elemento di formato e ha un significato speciale. Puoi aggiungere o rimuovere elementi di formato come richiesto.

Ecco un elenco completo degli elementi di formato che puoi utilizzare per il tuo modello di formato durante la formattazione dei numeri.

Anche se è vero che puoi fornire una stringa letterale per vari elementi di formato (ad esempio, un segno di dollaro ($ ) per dollari), questo presuppone che la valuta sia denominata in quel valore hardcoded. Esistono molte altre valute possibili in tutto il mondo e gli elementi del formato sono in grado di restituire dinamicamente il simbolo della valuta locale per la sessione dell'utente.

È lo stesso per il separatore di gruppo e il carattere decimale. Locali diversi utilizzano convenzioni diverse. L'utilizzo di questi elementi di formato con riconoscimento delle impostazioni locali rende il codice più portabile.

Inoltre, il TO_CHAR() La funzione consente di passare i propri parametri NLS all'interno della funzione. Ciò influisce solo su quella chiamata di funzione, quindi puoi cambiare cose come i simboli di valuta al volo senza bisogno di codificarlo nel tuo modello di formato o aggiornare i parametri NLS per la tua sessione.

Gli esempi seguenti mostrano come funziona ogni elemento di formato in modo più dettagliato.

Formatta i numeri come valuta

Ecco un esempio di formattazione di un numero come valuta:

SELECT 
    TO_CHAR(12, 'fmL99')
FROM DUAL;

Risultato:

$12

In questo caso, ho usato la L elemento di formato per specificare il simbolo della valuta locale. Il simbolo della valuta locale è determinato da NLS_CURRENCY parametro.

In alternativa puoi usare il C o U elementi di formato, che restituiscono rispettivamente il simbolo della valuta ISO e il simbolo della doppia valuta.

Vedi Come formattare i numeri come valuta in Oracle per ulteriori informazioni ed esempi.

Aggiungi un separatore di virgole/migliaia

Sebbene tu possa sempre utilizzare una virgola hardcoded per il separatore di migliaia/gruppo, questo non tiene conto dei paesi che utilizzano un punto per il separatore di gruppo. È ovviamente vero il contrario. Inoltre, alcuni paesi separano migliaia di gruppi con uno spazio sottile.

Puoi usare il G format per specificare un separatore di gruppo. Questo restituisce dinamicamente il separatore di gruppo applicabile come specificato in NLS_NUMERIC_CHARACTERS parametro. Questo parametro determina sia il separatore di gruppo che il carattere decimale.

Esempio:

SELECT 
    TO_CHAR(12345, 'fm99G999')
FROM DUAL;

Risultato:

12,345

Ecco un altro esempio con un numero maggiore:

SELECT 
    TO_CHAR(123456789, 'fm999G999G999')
FROM DUAL;

Risultato:

123,456,789

Vedi Come formattare un numero con una virgola in Oracle per una discussione più dettagliata.

Includi posizioni decimali

Sebbene sia vero che puoi codificare il tuo carattere radix (ad esempio un punto) nel tuo modello di formato, questo non soddisferà altre localizzazioni che utilizzano un carattere diverso.

Puoi usare il D format per restituire il carattere decimale/radix specificato in NLS_NUMERIC_CHARACTERS parametro per la sessione corrente:

SELECT 
    TO_CHAR(7, 'fm9D00')
FROM DUAL;

Risultato:

7.00

In questo caso ho usato due 0 formattare gli elementi dopo il carattere radix. Questo elemento di formato restituisce zeri finali, ove applicabile.

Usando un 9 sopprimerebbe tutti gli zeri finali in questo caso:

SELECT 
    TO_CHAR(7, 'fm9D99')
FROM DUAL;

Risultato:

7.

Tuttavia, se rimuoviamo il fm modificatore di formato, otteniamo un risultato diverso:

SELECT 
    TO_CHAR(7, '9D99')
FROM DUAL;

Risultato:

 7.00

Il fm il modificatore di formato sopprime qualsiasi riempimento applicato al risultato. Rimuovendolo, il nostro risultato è imbottito. Contiene uno spazio iniziale, perché è qui che sarebbe andato un segno negativo se il numero fosse stato negativo. E contiene anche zeri finali, perché abbiamo specificato due 9 formattare gli elementi.

Consulta 3 modi per formattare un numero in 2 posizioni decimali in Oracle per ulteriori idee su come formattare i numeri con posizioni decimali.

Rimuovi tutte le posizioni decimali

Esistono diversi modi per formattare un numero in modo che non abbia posizioni decimali. Un modo ovvio è semplicemente rimuovere la parte decimale dalla nostra stringa di formato:

SELECT 
    TO_CHAR(7, 'fm9')
FROM DUAL;

Risultato:

   7

Ma possiamo anche usare altre funzioni, come ROUND() , TRUNC() e CAST() per ottenere lo stesso effetto o un effetto simile.

Vedi 4 modi per formattare un numero senza decimali in Oracle per esempi.

Aggiungi zeri iniziali

Abbiamo un paio di opzioni quando si tratta di aggiungere zeri iniziali al nostro numero.

Ancora una volta, attenendoci a TO_CHAR() funzione, possiamo usare il 0 format per restituire zeri iniziali e finali.

SELECT 
    TO_CHAR(7, 'fm000')
FROM DUAL;

Risultato:

007

Se avessimo usato il 9 format, non avremmo zeri iniziali:

SELECT 
    TO_CHAR(7, 'fm999')
FROM DUAL;

Risultato:

   7

Tuttavia, se rimuoviamo il fm modificatore di formato, avremmo ottenuto uno spazio in cui qualsiasi zero iniziale sarebbe stato:

SELECT 
    TO_CHAR(7, '999')
FROM DUAL;

Risultato:

   7

Un altro modo per formattare un numero con zeri iniziali è con LPAD() funzione. Questa funzione applica il riempimento sinistro a una stringa oa un numero. Puoi specificare quale/i carattere/i utilizzare per il riempimento, quindi se usi uno zero, verrà riempito con zeri.

Vedi 2 modi per formattare un numero con zeri iniziali in Oracle per un esempio.

Come controllare i parametri NLS

I parametri NLS (National Language Support) determinano il comportamento specifico della locale sia sul client che sul server. Ciò include parametri che determinano quali caratteri utilizzare per separatore di gruppo, carattere decimale, simboli di valuta, ecc.

Controlliamo il valore attuale dei miei parametri NLS:

SELECT 
    PARAMETER,
    VALUE
FROM V$NLS_PARAMETERS;

Risultato:

                 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                            

I seguenti parametri determinano gli elementi di formattazione per numeri e valute:

  • NLS_CURRENCY
  • NLS_ISO_CURRENCY
  • NLS_NUMERIC_CHARACTERS
  • NLS_DUAL_CURRENCY

Il valore predefinito di questi parametri è determinato da NLS_TERRITORY parametro. Quando impostiamo il valore di NLS_TERRITORY parametro, questo imposta implicitamente il valore per vari altri parametri (inclusi i quattro citati).

Nel mio caso, il mio territorio è l'Australia, quindi questi quattro parametri riflettono il modo in cui i numeri sono tipicamente formattati in Australia. Se dovessi cambiarlo per dire Germania, quei quattro parametri verrebbero aggiornati per riflettere la formattazione per la Germania.

Tuttavia, puoi impostare in modo esplicito ogni parametro individualmente. Ciò ti consente di sovrascrivere il valore che è stato impostato implicitamente da NLS_TERRITORY parametro.