Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment formater un nombre avec une virgule dans Oracle

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