2012-11-15 36 views
1

我需要一些有关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

什么是最简单的方法来做到这一点,而不必重写整个事情?

+2

你为什么要在服务器端执行此操作?在你的应用程序中执行这种格式会容易得多。 – Taryn

+1

东西http://msdn.microsoft.com/en-us/library/ms188043.aspx – Paparazzi

+0

无论如何,如果(当?)必须支持欧洲或亚洲的货币时,您必须重新编写它,格式化规则完全不同。正如bluefeet所建议的那样,最好在客户端应用程序中执行此操作,您可以简单地使用现有的本地化功能而不是自己执行此操作(C#格式化可以[执行此操作](http://msdn.microsoft.com例如)/en-us/library/dwhawy9k(v=vs.100).aspx)。 – Pondlife

回答

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))将进行四舍五入,以产生忠实的翻译。

+0

这工作,谢谢 – optionsix

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', '') 
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,因为它假定您已经为前面的位置插入了逗号。