2010-01-27 55 views
10

我知道它可以在非SQL環境中輕鬆完成[數據後處理,前端,你有什麼],但目前還不可能。有沒有辦法採取decimal(5,2)並將其轉換爲varchar沒有尾隨零/小數點?例如:有什麼簡單的方法來格式化T-SQL中的小數?

declare @number decimal(5,2) 
set @number = 123.00 
select cast(@number as varchar) as FormattedNumber 

而結果是'123.00'。有沒有一種(簡單的)方法來取代'123'?同樣,而不是'123.30','123.3'?可以通過確定百分之零點十是否爲0並手動修剪字符來實現,但我想知道是否有更優雅的解決方案。

+3

我會從數據庫中原樣返回數據,並將格式保留到前端。你有沒有理由不能這樣做? – AdaTheDev 2010-01-27 21:54:14

+1

是的,就像我說的那樣,這不是一個真正的選擇 - 前端,因爲它現在太泛化了,沒有特殊的格式化特定字段的情況下返回(因爲列的數量可能會改變),沒有其他列需要被格式化,所以我看到的最簡單的事情就是從SQL執行它。 – 2010-01-27 21:59:02

+1

使用SQL Server 2012+可以使用FORMAT()函數。您將使用'#,##'或'#,##。0'作爲第二個參數。 msdn.microsoft.com/en-us/library/hh213505.aspx – Volvox 2014-06-23 17:38:54

回答

13

什麼:

SELECT CAST(CAST(@number AS float) AS varchar(10)) 

然而,你可能要與您的原始數據,首先仔細進行測試。

+0

謝謝!我希望有這樣簡單的事情。 – 2010-01-28 16:15:27

0

Convert函數可以做你想做的事情。

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm 
+1

嘗試過...非常適合日期時間,沒有小數點 – 2010-01-27 21:55:00

0

讓我再試試這個....

CREATE FUNCTION saneDecimal(@input decimal(5,2)) returns varchar(10) 
AS 
BEGIN 
DECLARE @output varchar(10) 
SET @output = CAST(@input AS varchar(10)) 

DECLARE @trimmable table (trimval char(1)) 
INSERT @trimmable VALUES ('0') 
INSERT @trimmable VALUES ('.') 

WHILE EXISTS (SELECT * FROM @trimmable WHERE trimval = CAST(SUBSTRING(@output, LEN(@output), 1) AS char(1))) 
    SET @output = LEFT(@output, LEN(@output) - 1) 

RETURN @output 
END 

GO 

SELECT dbo.saneDecimal(1.00) 
0

你可以在剝離while循環尾隨零:

declare @number decimal(5,2) 
declare @str varchar(100) 
set @number = 123.00 
set @str = @number 
while substring(@str,len(@str),1) in ('0','.',',') 
    set @str = substring(@str,1,len(@str)-1) 

但作爲AdaTheDev評論說,這是更容易完成客戶端。

0

簡單而優雅?與其說......但那是T-SQL爲您提供:

DECLARE @number decimal(5,2) = 123.00 
DECLARE @formatted varchar(5) = CAST(@number as varchar) 

SELECT 
    LEFT(
     @formatted, 
     LEN(@formatted) 
      - PATINDEX('%[^0.]%', REVERSE(@formatted)) 
      + 1 
    ) 
4

這種方式是非常簡單的:

DECLARE @Number DECIMAL(5,2) 

SELECT @Number = 123.65 

SELECT FormattedNumber = CAST(CAST(@Number AS DECIMAL(3,0)) AS VARCHAR(4)) 

返回 '124'。

唯一需要考慮的是您是否要向上/向下舍入,或者不捨去捨去零和小數點;在第二種情況下,您將DECIMAL作爲INT投入使用。

-2

此外,請閱讀聯機叢書中的T-SQL STR功能;這可以用於格式化浮動,並可能適用於您的情況。出於某種原因,它不會出現在與此問題相關的Google搜索中。

+0

是的,有一個原因。請檢查此問題的接受答案。 – fancyPants 2012-09-21 09:14:16

0

使用的格式(值,格式字符串,文化),在SQL Server 2012+

3

功能對於T-SQL的數字控制的格式,你應該使用FORMAT()功能。例如:

DECLARE @number DECIMAL(9,2); SET @number = 1234567.12; 
DECLARE @formatted VARCHAR(MAX); SET @formatted = FORMAT(@number, 'N0', 'en-AU'); 
PRINT @formatted; 

結果將是:

1,234,567 

FORMAT()函數的參數是:

FORMAT(value, format [, culture]) 

值參數是你的電話號碼。 format參數是一個CLR類型的格式化字符串(在本例中,我指定了「正常數字,零精度」)。可選的文化參數允許您覆蓋服務器文化設置,以根據所需的文化來格式化數字。

另請參閱the MSDN ref page for FORMAT()

0

如果您有SQL Server 2012中或更高,您可以使用格式函數如下:

select format(@number,'0') as FormattedNumber 

當然格式函數會返回一個nvarchar,而不是一個varchar。您可以投射以獲取特定類型。

相關問題