15

如何将十进制值转换为逗号?

对我有帮助。但我的问题是小数位仅设置为 2..我希望小数点为 2、3 或 4..示例

1,234.123   or    1,234.12345

我试过

convert(varchar, convert(decimal(18, 4), 1234.1234567), 1) 

输出:1234.1234

没有逗号。但如果我用钱,小数点只有 2

转换(varchar,转换(钱,1234.1234567),1)

输出:1,234.12

4

5 回答 5

31

谢天谢地(?),在SQL Server 2012+中,您现在可以使用FORMAT()来实现这一点:

FORMAT(@s,'#,0.0000')


在以前的版本中,冒着看起来很丑的风险

[查询]

declare @s decimal(18,10);
set @s = 1234.1234567;
select replace(convert(varchar,cast(floor(@s) as money),1),'.00',
    '.'+right(cast(@s * 10000 +10000.5 as int),4))

在第一部分中,我们使用 MONEY->VARCHAR 来生成逗号,但使用 FLOOR() 来确保小数转到.00. 这很容易识别并替换为小数点后的 4 位数字,使用移位 ( *10000) 和 CAST 作为 INT(截断)的混合来推导数字。

[结果]

|   COLUMN_0 |
--------------
| 1,234.1235 |

但是,除非您必须使用 SQL Server Management Studio 或 SQLCMD 交付业务报告,否则这绝不是正确的解决方案,即使可以做到。任何前端或报告环境都具有处理显示格式的适当功能。

于 2012-11-06T08:21:49.077 回答
15

不认为这是一个好主意......

select dbo.F_AddThousandSeparators(convert(varchar, convert(decimal(18, 4), 1234.1234567), 1))

功能

-- Author:      bummi
-- Create date: 20121106
CREATE FUNCTION F_AddThousandSeparators(@NumStr varchar(50)) 
RETURNS Varchar(50)
AS
BEGIN
declare @OutStr varchar(50)
declare @i int
declare @run int

Select @i=CHARINDEX('.',@NumStr)
if @i=0 
    begin
    set @i=LEN(@NumStr)
    Set @Outstr=''
    end
else
    begin   
     Set @Outstr=SUBSTRING(@NUmStr,@i,50)
     Set @i=@i -1
    end 


Set @run=0

While @i>0
    begin
      if @Run=3
        begin
          Set @Outstr=','+@Outstr
          Set @run=0
        end
      Set @Outstr=SUBSTRING(@NumStr,@i,1) +@Outstr  
      Set @i=@i-1
      Set @run=@run + 1     
    end

    RETURN @OutStr

END
GO
于 2012-11-06T07:28:06.203 回答
9

来自相关的 SO 问题: 在 SQL Server 2008 R2 中格式化一个带逗号但不带小数的数字?

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

这在 SQL Server 2008 R2 中进行了测试。

于 2015-01-05T21:11:53.350 回答
2

如果您使用的是 SQL Azure Reporting Services,则不支持“格式”功能。这实际上是在 SSRS 图表中格式化工具提示的唯一方法。因此,解决方法是返回一个列,该列具有用于工具提示的格式化数字的字符串表示形式。所以,我同意 SQL 不是格式化的地方。除非在这种情况下,该工具没有适当的功能来处理显示格式。

在我的情况下,我需要显示一个用逗号格式化且没有小数(输入小数 2)的数字,并在我的数据集查询中得到一个计算列的宝石:

,Fmt_DDS=reverse(stuff(reverse(CONVERT(varchar(25),cast(SUM(kv.DeepDiveSavingsEst) as money),1)), 1, 3, ''))

它有效,但对于以后维护报告的人来说非常丑陋且不明显。耶云!

于 2013-01-30T01:04:52.610 回答
-1

SQL(或者更准确地说,RDBMS)并不是格式化输出的正确选择。数据库应提供原始数据,然后应在目标应用程序中对其进行格式化(或更一般地说:处理)。

但是,根据您使用的特定系统,您可以编写一个 UDF(用户定义函数)来实现您想要的。但请记住,您实际上是在返回一个 varchar,您将无法进一步处理(例如总结)。

于 2012-11-06T07:10:15.260 回答