将数字格式化为货币值,包括分隔符

时间:2012-11-15 21:57:47

标签: sql sql-server tsql

我需要一些sql转换的帮助。我提供的这部分查询:

'$' + replace(cast((CAST(p.Price1 AS decimal(10,2)) * cast(isnull(p.Multiplier,1) as decimal(10,2))) as varchar), '.0000', '')

基本上,它最终是一个如下所示的varchar:$26980

我需要在千万分之一处插入一个逗号(如果适用)。所以在这个例子中,$26,980

在不重写整个事情的情况下,最简单的方法是什么?

3 个答案:

答案 0 :(得分:1)

如果你真的必须在TSQL中这样做,你可以使用CONVERT(),但这种事情真的不属于数据库:

declare @m money = 12345678
-- with decimal places
select '$' + convert(varchar, @m, 1)
-- without decimal places
select '$' + replace(convert(varchar, @m, 1), '.00', '')

答案 1 :(得分:1)

在客户端进行。话虽如此,这个例子应该告诉你。

with p(price1, multiplier) as (select 1234.5, 10)
select '$' + replace(cast((CAST(p.Price1 AS decimal(10,2)) * cast(isnull(p.Multiplier,1) as decimal(10,2))) as varchar), '.0000', ''),
       '$' + parsename(convert(varchar,cast(p.price1*isnull(p.Multiplier,1) as money),1),2)
from p

密钥位于最后一个表达式

'$' + parsename(convert(varchar,cast(p.price1*isnull(p.Multiplier,1) as money),1),2)

注意:如果p.price1的精度高于十进制(10,2),那么您可能必须将其强制转换为表达式以生成忠实的翻译,因为原始的CAST(p.Priced1 as decimal(10,2))将会正在进行四舍五入。

答案 2 :(得分:0)

你可以把它变成一个函数,它只能回50个字符。

DECLARE @input VARCHAR(50)
SELECT @input = '123123123.00'
SELECT @input = CASE WHEN CHARINDEX('.', @input) > offset +1
                      THEN STUFF(@input, CHARINDEX('.', @input) - offset, 0, ',') 
                      ELSE @input END
FROM (SELECT 3 offset UNION SELECT 7 UNION SELECT 12 UNION SELECT 18 UNION SELECT 25 UNION SELECT 33 UNION SELECT 42) b
PRINT @input

每个位置的偏移量增加+1,因为假设您已经为先前的位置插入了逗号。