2011-05-12 2 views
2

je dois formater des nombres comme (y compris décimaux signés!): -SQL Server 2005 - Format un nombre décimal avec zéros

1.99 
21.34 
1797.94 
-300.36 
-21.99 
-2.31 

Dans un masque de format de 0000,00, en utilisant SQL-Server 2005 T-SQL . Préserver les entiers signés et les décimales après le point. Cela serait utilisé pour les exportations de fichiers texte pour un système financier. Il l'exige pour être dans ce format.

e.g.-

0001.99 
0021.34 
1794.94 
-0300.36 
-0021.99 
-0002.31 

Auparavant, il a été fait dans MS Access comme Format([Total],"0000.00") mais SQL Server ne possède pas cette fonction.

Répondre

4
;WITH t(c) AS 
(
SELECT 1.99 UNION ALL 
SELECT 21.34 UNION ALL 
SELECT 1797.94 UNION ALL 
SELECT -300.36 UNION ALL 
SELECT -21.99 UNION ALL 
SELECT -2.31 
) 
SELECT 
    CASE WHEN SIGN(c) = 1 THEN '' 
      ELSE '-' 
    END + REPLACE(STR(ABS(c), 7, 2), ' ','0') 
FROM t 

Retours

0001.99 
0021.34 
1797.94 
-0300.36 
-0021.99 
-0002.31 
+1

Vous avez toujours un bon CTE. J'en ai eu un bon pour Oracle hier, traçant des factures récursivement à travers le système (parent/enfant) – SQLMason

+0

Merci Martin! Votre solution était celle que je recherchais le plus. C'est très élégant! – Learner74

1

Vous pouvez faire une fonction comme ceci:

CREATE FUNCTION [dbo].padzeros 
(
    @money MONEY, 
    @length INT 
) 
RETURNS varchar(100) 
-- ============================================= 
-- Author:  Dan Andrews 
-- Create date: 05/12/11 
-- Description: Pad 0's 
-- 
-- ============================================= 
-- select dbo.padzeros(-2.31,7) 
BEGIN 

DECLARE @strmoney VARCHAR(100), 
     @result VARCHAR(100) 

SET @strmoney = CAST(ABS(@money) AS VARCHAR(100)) 
SET @result = REPLICATE('0',@length-LEN(@strmoney)) + @strmoney 
IF @money < 0 
    SET @result = '-' + RIGHT(@result, LEN(@result)-1) 

RETURN @result 

END 

exemple:

select dbo.padzeros(-2.31,7) 
+1

Je n'ai pas remarqué que vous ne vouliez pas garder la même longueur (le caractère neg prend un espace). Vous pouvez simplement concaténer '-' à la chaîne au lieu de faire le DROIT – SQLMason

+0

Salut Dan, merci pour le code. Oui, c'est bizarre que le signe occupe un espace comme vous le dites, au lieu d'être totalement fixe. C'est pour un vieux système financier basé sur Cobol. : -/ – Learner74

+0

Je fais du travail à contrat dans les soirées programmant en FORTRAN sur un DEC Alpha ... ouais ... je sens ta douleur. Je pourrais probablement réécrire tout leur système dans .NET et cela fonctionnerait mieux et serait plus fonctionnel, mais consulter les développeurs FORTRAN ferait plus que de consulter les développeurs .NET. :) En plus, ça me rappelle les jours où la programmation était magique. – SQLMason