2010-06-26 4 views
6

J'ai une table avec 3 colonnes:Format double précision dans PostgreSQL

customer_name varchar 
,account_type varchar 
,current_balance double precision 

Exemples de valeurs pour current_balance:

 
1200 
1500.5 
1500 

Je veux qu'ils affichent comme ceci:

 
1200.00 
1500.50 
1500.00 

J'ai essayé la requête suivante:

SELECT to_char(current_balance,'9999999999999999D99') 
    FROM bank; 

Il formate comme je veux mais ajoute un espace au début. Comment résoudre ceci? Y a-t-il une meilleure façon de formater?

+8

Arrêtez-vous là où vous êtes. Lisez attentivement la section sur la façon dont les doubles sont traités dans Postgres. (Http://www.postgresql.org/docs/8.4/interactive/datatype-numeric.html#DATATYPE-FLOAT). Les doubles sont traités comme des valeurs à virgule flottante. Les flotteurs sont stockés et calculés de manière à ce qu'ils puissent perdre leur précision. N'utilisez pas de valeur à virgule flottante pour stocker une valeur monétaire. Utilisez les types 'NUMERIC' ou' DECIMAL'. – Charles

Répondre

6

Vous pouvez utiliser trim pour supprimer les espaces supplémentaires. Sans arguments, il supprime uniquement les espaces.

charles=# SELECT to_char(12345.67,'99999999999999999D99'); 
     to_char 
----------------------- 
       12345.67 
(1 row) 

charles=# SELECT trim(to_char(12345.67,'99999999999999999D99')); 
    btrim 
---------- 
12345.67 
(1 row) 
+0

salut Charles .. si mon enregistrement d'entrée est 0 (zéro) cette fois il donne .00 seulement. mais je veux 0,00 comment puis-je faire ça ..? – ungalnanban

+0

Je ne sais pas, en fait. J'apprends encore tous les tenants et les aboutissants de Postgres. Si tout le reste échoue, vous pouvez essayer un 'CASE' qui vérifie si le nombre est zéro, et retourne '0.00' si c'est le cas. – Charles

+2

Tard à la fête, mais quelqu'un devrait probablement mentionner '99 ... 0D99 'comme une solution possible à l'exigence de 0.00. – VoiceOfUnreason

2
to_char(current_balance, 'FM9999999999999999D99') 

De the docs:

FM: mode de remplissage préfixe (supprimer des blancs rembourrage et zéros)

Si vous voulez un symbole monétaire local spécifique, essayez L:

to_char(current_balance, 'FML9999999999999999D99') 

L: symbole monétaire (utilise locale)

Résultats de PG 8,4 contre colonne appelée dbl avec une valeur de 12345,678 où id = 1:

>>> import psycopg2 
>>> conn = psycopg2.connect(host='localhost', database='scratch', user='',password='') 
>>> c = conn.cursor() 

>>> c.execute("select to_char(dbl, '9999999999999999D99') from practice where id = 1;") 
>>> c.fetchall() # with padding 
[('   12345.68',)] 

>>> c.execute("select to_char(dbl, 'FM9999999999999999D99') from practice where id = 1;") 
>>> c.fetchall() # no padding 
[('12345.68',)] 

>>> c.execute("select to_char(dbl, 'FML9999999999999999D99') from practice where id = 1;") 
>>> c.fetchall() # with locale-specific currency symbol 
[('$12345.68',)] 
+0

non son donner mauvais formate. – ungalnanban

6

Comme déjà souligné dans un commentaire, it's bad design to use a floating point type (real, double, float) for a money balance. Cela vous mènera à des problèmes. Utilisez DECIMAL à la place.

+0

Ok merci ... Je note vos points et ici après je vais utiliser la décimale. – ungalnanban

+0

@ungalnanban: Cela concerne les erreurs d'arrondi lorsque vous n'utilisez pas de décimales, donc mieux vaut le faire, car si les sommes comptables sont erronées, toute conversion de type float-to-string sera votre moindre problème ... –