Lorsque vous utilisez le TO_CHAR()
pour formater un nombre dans Oracle, vous utilisez un modèle de format pour déterminer comment le nombre doit être formaté.
Par exemple, vous pouvez formater un nombre comme 12,345.00
ou comme 12.345,00
, selon votre région.
Le modèle de format peut inclure le G
ou D
éléments de format pour ajouter une virgule à un nombre. Celui que vous utilisez dépend si vous voulez la virgule comme séparateur de milliers ou comme caractère décimal.
Alternativement, vous pouvez utiliser un véritable caractère virgule (,
) si vous préférez, bien que cette méthode ne soit pas sensible aux paramètres régionaux comme le G
et D
les éléments de format sont.
Le G
et D
Éléments de format
Voici un exemple pour démontrer le G
et D
éléments de format :
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Résultat :
12,345.00
Dans ce cas, le séparateur de groupe produit une virgule et le caractère décimal produit un point. C'est parce que le NLS_TERRITORY
de ma session actuelle le paramètre est défini sur Australia
.
Voici ce qui se passe si je change mon NLS_TERRITORY
paramètre à Germany
:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Résultat :
12.345,00
Maintenant, la virgule est utilisée pour le caractère décimal.
En guise d'explication rapide du modèle de format ci-dessus :
- Le
fm
le modificateur de format supprime tout rembourrage qui pourrait être appliqué au résultat. - Le
9
les caractères représentent des nombres. - Le
0
représente des nombres sans supprimer les zéros de début ou de fin.
Voici une liste complète des éléments de format numérique que vous pouvez utiliser comme référence rapide.
Cle NLS_NUMERIC_CHARACTERS
Paramètre
Lorsque nous définissons le NLS_TERRITORY
paramètre (comme dans l'exemple précédent), cela définit implicitement un tas d'autres paramètres, y compris le NLS_NUMERIC_CHARACTERS
paramètre.
Cle NLS_NUMERIC_CHARACTERS
Le paramètre détermine quels caractères sont utilisés pour le séparateur de groupe et le caractère décimal.
Nous pouvons interroger le V$NLS_PARAMETERS
vue pour voir quels caractères sont utilisés pour le séparateur de groupe et le caractère décimal :
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
Résultat :
,.
Ici, nous voyons que le caractère décimal est représenté par une virgule, et le séparateur de groupe est représenté par un point.
Vous pouvez modifier la valeur du NLS_NUMERIC_CHARACTERS
paramètre directement si vous le souhaitez (c'est-à-dire sans modifier le NLS_TERRITORY
paramètre).
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Résultat :
12,345.00
Mais vous devriez probablement éviter de le faire, car cela provoque une déconnexion entre les paramètres NLS. Vos paramètres NLS ne reflètent plus les valeurs par défaut du territoire actuel. Sauf si vous avez une bonne raison de ne pas le faire, il est généralement préférable de modifier le NLS_TERRITORY
paramètre au territoire concerné, afin que d'autres paramètres puissent également être mis à jour à leur valeur par défaut pour le nouveau territoire.
Le 'nlsparam'
Argumentation
Une chose que je dois mentionner est que le T0_CHAR()
La fonction accepte un troisième argument qui vous permet de définir temporairement divers paramètres NLS, y compris le NLS_NUMERIC_CHARACTERS
paramètre. Lorsque vous faites cela au niveau de la fonction, cela ne change pas la valeur de ces paramètres pour la session en cours.
Voici un exemple :
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;
Résultat :
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
Ici, j'ai défini le territoire de la session sur l'Allemagne, puis j'ai appelé TO_CHAR()
trois fois.
- Le premier appel utilise les paramètres NLS de la session. Cela signifie que le séparateur de groupe par défaut est un point.
- Dans le deuxième appel, j'ai défini explicitement mon propre
NLS_NUMERIC_CHARACTERS
paramètre à partir de la fonction. Dans ce cas, j'ai défini le séparateur de groupe sur une virgule. Cela n'a pas affecté les paramètres NLS de ma session, comme le montre le troisième appel. - Le troisième appel utilise les paramètres NLS de la session, tout comme le premier appel. Comme nous pouvons le voir, le séparateur de groupe et le caractère décimal n'ont pas été affectés par le changement (temporaire) que nous avons effectué lors de notre deuxième appel.
Virgule codée en dur
Une autre façon d'ajouter une virgule à un nombre consiste à le coder en dur dans votre modèle de format.
Exemple :
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;
Résultat :
12,345.00
Dans ce cas, j'ai codé en dur la virgule et le point. Cela ignore le séparateur de groupe défini dans le NLS_NUMERIC_CHARACTERS
paramètre.
Plusieurs virgules
Vous pouvez avoir plusieurs virgules et/ou séparateurs de groupe dans un modèle de format.
Exemple :
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;
Résultat :
123,456,789.00
Emplacement de virgule non valide
Une virgule ou un séparateur de groupe ne peut pas apparaître à droite d'un caractère décimal ou d'un point dans un modèle de format numérique.
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;
Résultat :
Error report - ORA-01481: invalid number format model