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

Comment formater des nombres dans Oracle

Dans Oracle Database, vous pouvez formater les nombres de plusieurs manières.

Par exemple, vous pouvez formater un nombre comme une devise, avec des virgules et des points décimaux au bon endroit. Vous pouvez spécifier des zéros non significatifs, vous pouvez ajouter une partie fractionnaire - ou la supprimer, si c'est ce qui est nécessaire.

Cet article contient des exemples des éléments suivants :

  • Formater les nombres en devise
  • Ajouter un séparateur virgule/milliers
  • Inclure les décimales
  • Supprimer toutes les décimales
  • Ajouter des zéros non significatifs à un nombre

J'explique également comment le formatage est affecté par les paramètres NLS de votre session.

Les paramètres d'initialisation NLS déterminent les caractères utilisés pour le séparateur de groupe, le caractère décimal et le symbole monétaire dans la session en cours. Vous pouvez tirer parti de ces paramètres pour générer un formatage compatible avec les paramètres régionaux.

Vous pouvez utiliser des fonctions comme TO_CHAR(number) et même LPAD() pour convertir des nombres en une chaîne et les formater exactement comme vous le souhaitez à la volée. Des fonctions comme CAST() peut également avoir un effet sur la façon dont un nombre est formaté, selon le type de données dans lequel il est converti.

Un exemple rapide

Voici un exemple rapide de formatage d'un nombre en utilisant le TO_CHAR() fonction :

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

Résultat :

$12,345.00

Le fmL99G999D00 part est un modèle de format qui détermine comment la sortie doit être formatée. Vous pouvez modifier le modèle de format en fonction de vos besoins.

Chaque caractère du modèle de format est un élément de format et a une signification particulière. Vous pouvez ajouter ou supprimer des éléments de format selon vos besoins.

Voici une liste complète des éléments de format que vous pouvez utiliser pour votre modèle de format lors du formatage des nombres.

S'il est vrai que vous pouvez fournir un littéral de chaîne pour divers éléments de format (par exemple, un signe dollar ($ ) pour les dollars), cela suppose que la devise est libellée dans cette valeur codée en dur. Il existe de nombreuses autres devises possibles dans le monde et les éléments de format sont capables de renvoyer dynamiquement le symbole de la devise locale pour la session de l'utilisateur.

Il en est de même pour le séparateur de groupe et le caractère décimal. Différents paramètres régionaux utilisent différentes conventions. L'utilisation de ces éléments de format compatibles avec les paramètres régionaux rend votre code plus portable.

Aussi, le TO_CHAR() La fonction vous permet de transmettre vos propres paramètres NLS dans la fonction. Cela n'affecte que cet appel de fonction, vous pouvez donc modifier des éléments tels que les symboles monétaires à la volée sans avoir besoin de les coder en dur dans votre modèle de format ou de mettre à jour les paramètres NLS pour votre session.

Les exemples suivants montrent comment chaque élément de format fonctionne plus en détail.

Formater les nombres en devise

Voici un exemple de formatage d'un nombre en devise :

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

Résultat :

$12

Dans ce cas, j'ai utilisé le L élément de format pour spécifier le symbole de la devise locale. Le symbole de la devise locale est déterminé par le NLS_CURRENCY paramètre.

Vous pouvez également utiliser le C ou U éléments de format, qui renvoient respectivement le symbole monétaire ISO et le symbole monétaire double.

Voir Comment formater des nombres en tant que devise dans Oracle pour plus d'informations et d'exemples.

Ajouter une virgule/séparateur de milliers

Bien que vous puissiez toujours utiliser une virgule codée en dur pour votre séparateur de milliers/groupe, cela ne prend pas en compte les pays qui utilisent un point pour leur séparateur de groupe. L'inverse est évidemment vrai. De plus, certains pays séparent des milliers de groupes avec un espace fin.

Vous pouvez utiliser le G élément de format pour spécifier un séparateur de groupe. Cela renvoie dynamiquement le séparateur de groupe applicable comme spécifié dans le NLS_NUMERIC_CHARACTERS paramètre. Ce paramètre détermine à la fois le séparateur de groupe et le caractère décimal.

Exemple :

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

Résultat :

12,345

Voici un autre exemple avec un nombre plus grand :

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

Résultat :

123,456,789

Voir Comment formater un nombre avec une virgule dans Oracle pour une discussion plus détaillée.

Inclure les décimales

S'il est vrai que vous pouvez coder en dur votre propre caractère de base (par exemple, un point) dans votre modèle de format, cela ne répondra pas aux autres paramètres régionaux qui utilisent un caractère différent.

Vous pouvez utiliser le D élément de format pour renvoyer le caractère décimal/radix spécifié dans le NLS_NUMERIC_CHARACTERS paramètre pour la session en cours :

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

Résultat :

7.00

Dans ce cas, j'ai utilisé deux 0 éléments de format après le caractère de base. Cet élément de format renvoie des zéros à la fin, le cas échéant.

Utiliser un 9 supprimerait tous les zéros à droite dans ce cas :

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

Résultat :

7.

Cependant, si nous supprimons le fm modificateur de format, nous obtenons un résultat différent :

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

Résultat :

 7.00

Le fm Le modificateur de format supprime tout rembourrage appliqué au résultat. En le supprimant, notre résultat est rembourré. Il contient un espace au début, car c'est là qu'un signe négatif serait allé si le nombre avait été négatif. Et il contient également des zéros à la fin, car nous avons spécifié deux 9 éléments de format.

Voir 3 façons de formater un nombre à 2 décimales dans Oracle pour plus d'idées sur la façon de formater des nombres avec des décimales.

Supprimer toutes les décimales

Il existe plusieurs façons de formater un nombre pour qu'il n'y ait pas de décimales. Un moyen évident consiste simplement à supprimer la partie décimale de notre chaîne de format :

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

Résultat :

7

Mais nous pouvons également utiliser d'autres fonctions, telles que ROUND() , TRUNC() , et CAST() pour obtenir le même effet ou un effet similaire.

Voir 4 façons de formater un nombre sans décimales dans Oracle pour des exemples.

Ajouter des zéros non significatifs

Nous avons plusieurs options pour ajouter des zéros non significatifs à notre numéro.

Encore une fois, restez avec le TO_CHAR() fonction, nous pouvons utiliser le 0 élément de format pour renvoyer des zéros de début et de fin.

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

Résultat :

007

Si nous avions utilisé le 9 élément de format, nous n'aurions pas de zéros non significatifs :

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

Résultat :

7

Cependant, si nous supprimons le fm modificateur de format, nous aurions obtenu un espace où n'importe quel zéro non significatif aurait été :

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

Résultat :

   7

Une autre façon de formater un nombre avec des zéros non significatifs est avec le LPAD() une fonction. Cette fonction applique un remplissage gauche à une chaîne ou à un nombre. Vous pouvez spécifier quel(s) caractère(s) utiliser pour le remplissage, et donc si vous utilisez un zéro, il sera rempli de zéros.

Voir 2 façons de formater un nombre avec des zéros non significatifs dans Oracle pour un exemple.

Comment vérifier les paramètres NLS

Les paramètres NLS (National Language Support) déterminent le comportement spécifique aux paramètres régionaux sur le client et le serveur. Cela inclut les paramètres qui déterminent les caractères à utiliser pour le séparateur de groupe, le caractère décimal, les symboles monétaires, etc.

Vérifions la valeur actuelle de mes paramètres NLS :

SELECT 
    PARAMETER,
    VALUE
FROM V$NLS_PARAMETERS;

Résultat :

                 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                            

Les paramètres suivants déterminent les éléments de formatage des nombres et des devises :

  • NLS_CURRENCY
  • NLS_ISO_CURRENCY
  • NLS_NUMERIC_CHARACTERS
  • NLS_DUAL_CURRENCY

La valeur par défaut de ces paramètres est déterminée par le NLS_TERRITORY paramètre. Lorsque nous définissons la valeur de NLS_TERRITORY paramètre, cela définit implicitement la valeur de divers autres paramètres (y compris les quatre mentionnés).

Dans mon cas, mon territoire est l'Australie, et donc ces quatre paramètres reflètent la façon dont les nombres sont généralement formatés en Australie. Si je devais le changer pour dire, Allemagne, alors ces quatre paramètres seraient mis à jour pour refléter le formatage pour l'Allemagne.

Cependant, vous pouvez définir explicitement chaque paramètre individuellement. Cela vous permet de remplacer la valeur implicitement définie par le NLS_TERRITORY paramètre.