2010-10-14 63 views
2

我想在象-2000托架負值放置到(2000)如何放置負值成括號

對於我犯了一個被轉換-1361236.75886298至(1.36124e + 006)

我對本作的功能是:

ALTER function [dbo].[IsNegative](
@Number NVARCHAR (500) 
) 
Returns nvarchar (200) 
as 
begin 
Declare @Number2 FLOAT 
set @Number2=Cast (@Number as float) 
Declare @result nvarchar (200) 
if (@Number2 <=0.0) 
begin 
Set @result='('+Substring (@Number,2,len(@Number))+')' 
end 
else   
begin 
Set @result = @Number 
end 
return @result 
end 

我想提前

+2

那麼究竟是什麼問題? – 2010-10-14 11:52:33

+1

我只看到負數放在括號內的唯一地方就是會計系統。如果這就是你正在構建的,我建議使用DECIMAL而不是FLOAT,因爲它提供了更高的精度 - 哪些會計師喜歡。 – 2010-10-14 12:08:10

回答

3

準確的answere 感謝名單是什麼THI所提出的使用s功能?

這種類型的格式可能是最好由表示層(假設是一個呈現層)

下面的函數可能是適合於格式化將被連接成更長的字符串個別獨立的值。它可能不適用于格式化多個值,因爲您希望這些值都以小數點對齊。爲此,您可以調查str函數。

CREATE FUNCTION [dbo].[IsNegative](
@Number DECIMAL(38,16) 
) 
RETURNS VARCHAR (50) 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
DECLARE @result VARCHAR (50) 

/*Trim trailing zeroes and decimal point*/ 
SET @result = REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(@Number,'0', ' ')),' ', '0'),'.', ' ')),' ', '.') 

IF @Number < 0 
    SET @result = '(' + SUBSTRING(@result,2,LEN(@result)) + ')' 

RETURN @result 
END 


GO 

WITH T AS 
(
SELECT -1361236.75886298 AS N UNION ALL 
SELECT -2000 UNION ALL 
SELECT 2000 
) 

SELECT 
    [dbo].[IsNegative](N) 
FROM T 

返回

(1361236.75886298) 
(2000) 
2000 

是你需要什麼?

1

對於SQL Server 2012及更高版本,替代方法是使用FORMAT函數將負數括在括號內。

一個小侷限是您需要指定最大小數位數。

WITH T AS 
(
SELECT -1361236.75886298 AS N UNION ALL 
SELECT -2000 UNION ALL 
SELECT 2000 
) 

SELECT 
    FORMAT (N, '#,###.##########;(#,###.##########)') 
FROM T 

結果:

(1,361,236.75886298) 
(2,000) 
2,000 
1

該溶液還可以與 '案例' 來實現的。例如,假設我有一個表a,列abc的值爲:

select abc, case when abc>=0, abc else '(' + Convert(varchar,abs(abc),106) + ')' End From a 
相關問題