Quando usi TO_CHAR()
per formattare un numero in Oracle, si utilizza un modello di formato per determinare come formattare il numero.
Ad esempio, puoi formattare un numero come 12,345.00
o come 12,345.00
, a seconda della tua località.
Il modello di formato può includere il G
o D
formattare gli elementi per aggiungere una virgola a un numero. Quello che usi dipende dal fatto che tu voglia la virgola come separatore di migliaia o come carattere decimale.
In alternativa, puoi utilizzare un vero e proprio carattere virgola (,
) se preferisci, anche se questo metodo non riconosce le impostazioni locali come il G
e D
gli elementi di formato sono.
Il G
e D
Formatta elementi
Ecco un esempio per dimostrare il G
e D
elementi di formato:
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Risultato:
12,345.00
In questo caso, il separatore di gruppo emette una virgola e il carattere decimale emette un punto. Questo perché la mia sessione attuale è NLS_TERRITORY
il parametro è impostato su Australia
.
Ecco cosa succede se cambio il mio NLS_TERRITORY
parametro a Germany
:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Risultato:
12,345.00
Ora la virgola viene utilizzata per il carattere decimale.
Come una rapida spiegazione del modello di formato sopra:
- Il
fm
il modificatore di formato sopprime qualsiasi riempimento che potrebbe essere applicato al risultato. - Il
9
i caratteri rappresentano i numeri. - Il
0
il carattere rappresenta i numeri senza sopprimere gli zeri iniziali o finali.
Ecco un elenco completo di elementi di formato numerico che puoi utilizzare come riferimento rapido.
Tegli NLS_NUMERIC_CHARACTERS
Parametro
Quando impostiamo il NLS_TERRITORY
parametro (come nell'esempio precedente), questo imposta implicitamente una serie di altri parametri, incluso il NLS_NUMERIC_CHARACTERS
parametro.
Tegli NLS_NUMERIC_CHARACTERS
parametro determina quali caratteri vengono utilizzati per il separatore di gruppo e il carattere decimale.
Possiamo interrogare il V$NLS_PARAMETERS
visualizza per vedere quali caratteri vengono utilizzati per il separatore di gruppo e il carattere decimale:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
Risultato:
,.
Qui vediamo che il carattere decimale è rappresentato da una virgola e il separatore di gruppo è rappresentato da un punto.
Puoi modificare il valore di NLS_NUMERIC_CHARACTERS
parametro direttamente se vuoi (cioè senza cambiare il NLS_TERRITORY
parametro).
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Risultato:
12,345.00
Ma probabilmente dovresti evitare di farlo, perché provoca una disconnessione tra i parametri NLS. I tuoi parametri NLS non riflettono più i valori predefiniti per il territorio corrente. A meno che tu non abbia buone ragioni per non farlo, di solito è meglio cambiare NLS_TERRITORY
parametro al territorio pertinente, in modo che anche altri parametri possano essere aggiornati ai valori predefiniti per il nuovo territorio.
Il 'nlsparam'
Argomento
Una cosa che dovrei menzionare è che il T0_CHAR()
accetta un terzo argomento che consente di impostare temporaneamente vari parametri NLS, incluso il NLS_NUMERIC_CHARACTERS
parametro. Quando lo fai a livello di funzione, non cambia il valore di quei parametri per la sessione corrente.
Ecco un esempio:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT
TO_CHAR(12345, 'fm99G999D00') AS "r1",
TO_CHAR(
12345, 'fm99G999D00',
'NLS_NUMERIC_CHARACTERS = ''.,'''
) AS "r2",
TO_CHAR(12345, 'fm99G999D00') AS "r3"
FROM DUAL;
Risultato:
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
Qui, ho impostato il territorio della sessione su Germania, quindi ho chiamato TO_CHAR()
tre volte.
- La prima chiamata utilizza i parametri NLS della sessione. Ciò significa che il separatore di gruppo predefinito è un punto.
- Nella seconda chiamata, ho impostato esplicitamente il mio
NLS_NUMERIC_CHARACTERS
parametro dall'interno della funzione. In questo caso, ho impostato il separatore di gruppo su una virgola. Ciò non ha influito sui parametri NLS della mia sessione, come visto dalla terza chiamata. - La terza chiamata utilizza i parametri NLS della sessione, proprio come la prima chiamata. Come possiamo vedere, il separatore di gruppo e il carattere decimale non sono stati influenzati dalla modifica (temporanea) che abbiamo fatto nella nostra seconda chiamata.
Virgola hardcoded
Un altro modo per aggiungere una virgola a un numero consiste nel codificarlo nel tuo modello di formato.
Esempio:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;
Risultato:
12,345.00
In questo caso ho codificato la virgola e il punto. In questo modo si ignora il separatore di gruppo impostato in NLS_NUMERIC_CHARACTERS
parametro.
Virgole multiple
Puoi avere più virgole e/o separatori di gruppo all'interno di un modello di formato.
Esempio:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;
Risultato:
123,456,789.00
Posizionamento della virgola non valido
Una virgola o un separatore di gruppo non può apparire a destra di un carattere decimale o di un punto in un modello di formato numerico.
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;
Risultato:
Error report - ORA-01481: invalid number format model