2011-05-12 63 views
2

我需要一个像格式化数字(包括签名的小数!): -SQL Server 2005中 - 格式化带前导零的十进制数

1.99 
21.34 
1797.94 
-300.36 
-21.99 
-2.31 

入0000.00格式掩码,使用SQL-Server 2005的T-SQL 。保留点号后的有符号整数和小数点。这将用于金融系统的文本文件导出。它要求它采用这种格式。

e.g.-

0001.99 
0021.34 
1794.94 
-0300.36 
-0021.99 
-0002.31 

此前,有人在MS Access做的Format([Total],"0000.00")但SQL-Server没有这个功能。

回答

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 

返回

0001.99 
0021.34 
1797.94 
-0300.36 
-0021.99 
-0002.31 
+1

你总是有一个良好的CTE。我昨天对甲骨文有了一个不错的报告,通过系统递归追踪发票(父母/子女关系) – SQLMason 2011-05-12 14:40:52

+0

谢谢马丁!你的解决方案是我最想找的。它非常优雅! – Learner74 2011-05-12 15:02:45

1

你可以做这样的函数:

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 

例如:

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

我没有注意到你不想保持长度不变(neg字符需要一个空格)。您可以将“ - ”连接到字符串,而不是执行RIGHT – SQLMason 2011-05-12 14:33:31

+0

嗨Dan,感谢您的代码。是的,奇怪的是,标志占据了你所说的空间,而不是完全固定的宽度。这是一个古老的基于Cobol的金融系统。 : -/ – Learner74 2011-05-12 15:01:31

+0

我在DEC的阿尔法在FORTRAN的晚间节目中做一些合同工作......是的......我感觉到你的痛苦。我可能可以用.NET重写他们的整个系统,它会运行得更好,功能更强大,但咨询FORTRAN开发人员不仅仅是咨询.NET开发人员。 :)此外,它让我想起编程神奇的日子。 – SQLMason 2011-05-13 12:06:58