2012-11-03 121 views
8

我正在使用以下內容在T-SQL中創建逗號格式的數字。如何擺脫小數點後的小數點以及數字。所以如果我在格式化後得到1,112.00,我怎麼才能得到1,112?在SQL Server 2008 R2中用逗號格式化數字,但沒有小數?

SELECT CONVERT(varchar, CAST(1112 AS money), 1) 
+0

我該如何標記2個答案?我添加了一個詳細的答案,加上米奇的帖子也是一個答案。 – Sunil

+2

使用SQL Server 2012+您可以使用FORMAT()函數。你會使用'#,##'作爲你的第二個參數。 http://msdn.microsoft.com/en-us/library/hh213505.aspx – Volvox

+0

可能重複[如何在T-SQL中用逗號格式化數字?](https://stackoverflow.com/questions/4377352/how-do-i-format -a-number-with-commas-in -t-sql) –

回答

17
DECLARE @val varchar(50) 

set @val = CONVERT(varchar(50), CAST(1112 AS money), 1) 
SELECT left(@val, len(@val) - 3) 

這也小數點後的作品以數字:

DECLARE @val varchar(50) 

set @val = CONVERT(varchar(50), CAST(1112.56 AS money), 1) 
SELECT left(@val, len(@val) - 3) 

注意:作爲@Mahmoud賈邁勒指出,格式化往往更適合於從前到執行結束。

16

像這樣:

SELECT REPLACE(CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1), '.00', ''); 

這將始終正常工作。由於CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1)將始終使用.00返回一個數字。但是,如果在逗號後面有十進制數字,MitchWheat's answer會更好。

請注意,:你應該考慮在前端應用程序中做這個格式化的東西。 T-SQL與格式無關。

+0

Mahmoud - 感謝您的幫助。如果我們有1112.34,那麼截斷.00將不起作用。我正在尋找一個通用的解決方案。 – Sunil

+0

@Sunil - 是的,你是對的。這在1112.34的情況下將不起作用。但是,如果你在你的問題中提到的情況下,它總能正常工作。因爲'CONVERT(VARCHAR(20),CAST(1112 AS MONEY),1);'總是用'.00'返回一個數字不是嗎?任何方式@MitchWheat的答案比這更好,它適用於這種情況。 –

+0

+1有關前端應用程序格式化的觀點。 –

1

經過一番研究,我發現了2個可能的答案,我的第一個問題。它們列在下面。

選項1:米奇小麥的答案是一個可能的答案。但是,當想要在SELECT中格式化列值時,我們必須使用Mitch的T-SQL代碼創建用戶定義的標量函數,並從SQL中調用此UDF。

-- ============================================= 
-- Description: Formats a number and truncates 
--    the decimal part. You can pass 
--    a number as a string or a numeric type. 
-- ============================================= 
CREATE FUNCTION dbo.Utility_fn_FormatNumberAndTruncateDecimals 
(
    @unFormattedNumber VARCHAR(100) 
) 
RETURNS VARCHAR(100) 
    AS 
BEGIN 
    DECLARE @val VARCHAR(100) 
    SET @val = convert(VARCHAR(50), cast(@unFormattedNumber AS MONEY), 1) 

    RETURN (SELECT left(@val, len(@val) - 3)) 
END 
GO 

--call this function using either of the SELECTS below 
SELECT dbo.Utility_fn_FormatNumberAndTruncateDecimals('233444') 
SELECT dbo.Utility_fn_FormatNumberAndTruncateDecimals(233444.345) 

選項2:我們可以使用所謂的「PARSENAME」一個內置的系統功能,如下面T-SQL代碼,格式化和截斷小數。

SELECT PARSENAME(CONVERT(VARCHAR, CAST('2334442221.345222' AS MONEY), 1),2) 
+0

「但是,當一個人想要在SELECT中格式化列值時 - 」不正確。我這樣做是爲了讓意圖清楚。我可以輕鬆地將它內聯。 –

+0

米奇 - 你說得對。不知何故,我忽略了這個事實。我可以剛剛使用你的邏輯內聯。欣賞你的答案。 – Sunil

9
PARSENAME(CONVERT(VARCHAR,CAST(1112 AS MONEY),1),2) 

這將很好地工作。

將數字自動轉換爲貨幣數據類型2個零點將在小數點後添加。 PARSENAME函數將刪除該零。

+0

這是怎麼回事? – Govind

+0

我已刪除我的評論。在將來,使用OP的實際變量名稱和/或值以及包含正在發生的事情的描述將非常有用,而不僅僅是發佈一段代碼。由於這些缺失,似乎這個代碼與這個問題無關,但我在這個假設中是不正確的。 –

+0

好的建議.. – Govind

相關問題