2010-05-17 6 views
3

Nous stockons une décimale (9,8) dans notre base de données. Il peut avoir n'importe quel nombre de places après le point décimal (bien, pas plus de 8). Je suis frustré parce que je veux l'afficher en tant que texte lisible par l'homme dans le cadre d'une chaîne plus grande créée sur le serveur. Je veux autant de décimales à droite de la virgule comme sont non nuls, par exemple:Bonne façon de formater la décimale dans SQL Server

0.05 
0.12345 
3.14159265 

sont tous bons

Si je

CAST(d AS varchar(50)) 

je suis mise en forme comme:

0.05000000 
0.12345000 
3.14159265 

Je reçois une sortie similaire si je convertis/convertis en un type float ou autre avant d'être converti en un varchar. Je sais comment faire un nombre fixe de décimales, telles que:

0.050 
0.123 
3.142 

Mais ce n'est pas ce que je veux. Oui, je sais que je peux le faire par le biais de manipulation de chaînes compliquée (REPLACE, etc), il devrait y avoir un bon moyen de le faire.

+0

Vous trouverez dans les cas comme celui-ci que les outils de reporting font un meilleur travail à la mise en forme de bases de données ne. – JeffO

+1

Pour ne pas insister sur le point, mais la raison pour laquelle cela est lourd à faire en SQL est que SQL n'est pas conçu pour formater les données; il est conçu pour renvoyer des données. Ainsi, cela serait plus facile en retournant une décimale à l'application appelante et laissez-la la formater comme vous le souhaitez. SQL est horrible à la manipulation de chaîne comme vous pouvez le voir dans les solutions de contournement. – Thomas

Répondre

2

Jouer autour (serveur SQL) je trouve que la coulée de flotter d'abord fait le tour ..

select cast(cast(0.0501000 as float) as varchar(50)) 

rendements

0.0501

+0

Cela fonctionne comme vous l'avez écrit, mais pas avec les données de ma table. Je posterai une fois que je sais pourquoi. – Brad

+2

"3.14159265" renvoie "3.14159" avec cette approche. Je serais également préoccupé par la nature approximative des flottants, qui peuvent ne pas être en mesure de représenter pleinement les décimales – AdaTheDev

+0

Travailler maintenant, juste une faute de frappe, a toujours le problème signalé par AdaTheDev (pas un problème pour moi, mais pourrait être pour d'autres) – Brad

0

Pour tout autre que assez simple manipulation, je d envisager de le faire dans votre code d'appel au lieu de tbh car je pense qu'il est généralement préférable pour SQL de retourner les données telles quelles depuis la base de données, puis laisser le formatage de ce qui l'appelle, ce qui est plus que probable orienté pour la manipulation de la chaîne. Surtout si vous vous trouvez sauter par des cerceaux pour essayer de l'atteindre.

+0

Comme je l'ai dit dans mon message, le code appelant attend une chaîne. Selon les autres données de la base de données, ce nombre peut ou non faire partie de cette chaîne. – Brad

2

Code copied almost verbatim from here (Discute également la limite de 6 chiffres sur le flotteur formatage en mode 0):

DECLARE @num3 TABLE (i decimal(9, 8)) 

INSERT @num3 
     SELECT 0.05 
     UNION ALL 
     SELECT 0.12345 
     UNION ALL 
     SELECT 3.14159265 
SELECT i 
     ,CASE WHEN PATINDEX('%[1-9]%', REVERSE(i)) < PATINDEX('%.%', REVERSE(i)) 
      THEN LEFT(i, LEN(i) - PATINDEX('%[1-9]%', REVERSE(i)) + 1) 
      ELSE LEFT(i, LEN(i) - PATINDEX('%.%', REVERSE(i))) 
     END 'Converted' 
FROM @num3 
+0

Ceci est une manipulation de chaîne compliquée. – Brad

+0

@Brad - malheureusement, la manipulation de chaînes est la façon de le faire si elle * doit * être faite en SQL - vous pouvez envelopper la manipulation dans un UDF. Vous pourriez utiliser SQL CLR à la place, mais je ne voudrais pas vraiment y aller moi-même.Downvotes un peu à mon humble avis - en particulier car ils ne compromettent pas les données retournées. – AdaTheDev

+0

@AdaTheDev - J'éviterais un UDF scalaire parce qu'il a tendance à mal fonctionner. –