2011-05-12 107 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