如何在T-SQL中使用逗号格式化数字?

mat*_*mc3 183 t-sql sql-server

我正在运行一些管理查询并sp_spaceused在SQL Server 2008中编译结果,以查看数据库中某些表的数据/索引空间比率.当然,我在结果中得到了各种各样的大数字,我的眼睛开始变得光彩照人.如果我可以用逗号格式化所有这些数字将非常方便(987654321变为987,654,321).有趣的是,在我使用SQL Server的这么多年里,这个问题从来没有出现,因为大多数时候我会在表示层进行格式化,但在这种情况下,SSMS中的T-SQL结果就是表示.

我只考虑创建一个简单的CLR UDF来解决这个问题,但看起来这应该只是普通的旧T-SQL.那么,我将在这里提出问题 - 你如何在vanilla T-SQL中进行数字格式化?

Phi*_*unt 251

虽然我同意所有人,包括OP,他们说格式化应该在表示层中完成,但是这种格式化可以通过转换money然后转换为T-SQL来完成varchar.这确实包括尾随小数,但可以循环使用SUBSTRING.

SELECT CONVERT(varchar, CAST(987654321 AS money), 1)
Run Code Online (Sandbox Code Playgroud)

  • 虽然我同意通常格式化应该在其他地方发生,但我们都认为日期格式化功能是理所当然的.逗号插入可以如此处所示完成.+1. (12认同)
  • 您可以替换SELECT REPLACE(CONVERT(varchar,CAST(987654321 AS money),1),',','''') (6认同)
  • 但是,这不适用于其他mony格式化样式.在瑞士,我们用这种形式写钱:987'654'321.00如何做到这一点? (4认同)
  • 虽然我同意格式化应尽可能在表示层中完成,但有时候,例如Ignite/DPA警报,我收到的电子邮件是表示层.将逗号放在诸如此类的地方的唯一方法是通过SQL.在这些情况下,大量使用逗号非常有帮助. (4认同)
  • 每个人都想告诉你“应该”做什么,但这不是设计你自己的代码的目的。如果每个人都只做“应该”做的事情,那么我们就会失去创造力和将事物组合在一起以最少的麻烦和努力快速解决问题的能力。 (3认同)

Tho*_*ler 150

在SQL Server 2012及更高版本中,这将使用逗号格式化数字:

select format([Number], 'N0')
Run Code Online (Sandbox Code Playgroud)

您还可以更改0为所需的小数位数.

  • 这是现在引入`format`函数以来的最佳答案. (15认同)
  • 值得注意的是第三个(可选)参数“culture”。 (2认同)

zom*_*omf 58

我建议使用Replace代替Substring以避免字符串长度问题:

REPLACE(CONVERT(varchar(20), (CAST(SUM(table.value) AS money)), 1), '.00', '')
Run Code Online (Sandbox Code Playgroud)

  • 尽管货币转换不应该改变,但我喜欢保证不会超出Substring的优惠范围. (3认同)

bil*_*nkc 47

对于SQL Server 2012+实现,您将能够使用FORMAT将字符串格式应用于非字符串数据类型.

在最初的问题中,用户已经请求使用逗号作为千位分隔符.在一个封闭的重复问题中,用户询问他们如何应用货币格式.以下查询显示了如何执行这两个任务.它还演示了文化的应用,使其成为一种更通用的解决方案(解决了Tsiridis Dimitris应用希腊语特殊格式的功能)

-- FORMAT
-- http://msdn.microsoft.com/en-us/library/hh213505(v=sql.110).aspx
-- FORMAT does not do conversion, that's the domain of cast/convert/parse etc
-- Only accepts numeric and date/time data types for formatting. 
--
-- Formatting Types
-- http://msdn.microsoft.com/en-us/library/26etazsy.aspx

-- Standard numeric format strings
-- http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
SELECT
    -- c => currency
    -- n => numeric
    FORMAT(987654321, N'N', C.culture) AS some_number
,   FORMAT(987654321, N'c', C.culture) AS some_currency
,   C.culture
FROM
    (
        -- Language culture names
        -- http://msdn.microsoft.com/en-us/library/ee825488(v=cs.20).aspx
        VALUES
            ('en-US')
        ,   ('en-GB')
        ,   ('ja-JP')
        ,   ('Ro-RO')
        ,   ('el-GR')
    ) C (culture);
Run Code Online (Sandbox Code Playgroud)

SQLFiddle为上述


Con*_*ngo 20

演示1

演示添加逗号:

PRINT FORMATMESSAGE('The number is: %s', format(5000000, '#,##0'))
-- Output
The number is: 5,000,000
Run Code Online (Sandbox Code Playgroud)

演示2

演示逗号和小数点.如有必要,请注意它会舍入最后一位数字.

PRINT FORMATMESSAGE('The number is: %s', format(5000000.759145678, '#,##0.00'))
-- Output
The number is: 5,000,000.76
Run Code Online (Sandbox Code Playgroud)

兼容性

SQL Server 2012+.

  • 这是一个!使用len(列)以及专栏 - 而我试过的另一个2012+解决方案没有. (2认同)
  • 伟大的!这是我一直在寻找的答案(与 T-SQL 一起使用,包括 [在 **SEDE**](https://data.stackexchange.com/stackoverflow/query/876980/t-sql-format-number-千位之间用逗号)) (2认同)

hoj*_*.mi 9

SELECT REPLACE(CONVERT(varchar(20), (CAST(9876543 AS money)), 1), '.00', '')
Run Code Online (Sandbox Code Playgroud)

输出= 9,876,543

您可以用列名替换9876543.


小智 9

请尝试以下查询:

SELECT FORMAT(987654321,'#,###,##0')
Run Code Online (Sandbox Code Playgroud)

右小数点格式:

SELECT FORMAT(987654321,'#,###,##0.###\,###')
Run Code Online (Sandbox Code Playgroud)

  • 是的,现在我们拥有`FORMAT`函数的正确方法是`SELECT format(123456789987654321,'###,## 0')`,或者更简单地说,`select format(123456789987654321,'N0')`as @托马斯·穆勒回答道. (3认同)

小智 7

尝试上面的金钱技巧,这适用于具有两个或更少有效数字的数值.我创建了自己的函数来格式化带小数的数字:

CREATE FUNCTION [dbo].[fn_FormatWithCommas] 
(
    -- Add the parameters for the function here
    @value varchar(50)
)
RETURNS varchar(50)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @WholeNumber varchar(50) = NULL, @Decimal varchar(10) = '', @CharIndex int = charindex('.', @value)

    IF (@CharIndex > 0)
        SELECT @WholeNumber = SUBSTRING(@value, 1, @CharIndex-1), @Decimal = SUBSTRING(@value, @CharIndex, LEN(@value))
    ELSE
        SET @WholeNumber = @value

    IF(LEN(@WholeNumber) > 3)
        SET @WholeNumber = dbo.fn_FormatWithCommas(SUBSTRING(@WholeNumber, 1, LEN(@WholeNumber)-3)) + ',' + RIGHT(@WholeNumber, 3)



    -- Return the result of the function
    RETURN @WholeNumber + @Decimal

END
Run Code Online (Sandbox Code Playgroud)


小智 5

这属于对Phil Hunt的回答的评论,但可惜我没有代表。

要去除数字字符串末尾的“.00”, parsename 非常方便。它对以句点分隔的字符串进行标记并返回指定的元素,从最右边的标记作为元素 1 开始。

SELECT PARSENAME(CONVERT(varchar, CAST(987654321 AS money), 1), 2)
Run Code Online (Sandbox Code Playgroud)

产量“987,654,321”