【问题标题】:Thousand separator to large number in SQL Server 2005SQL Server 2005 中的千位分隔符到大数
【发布时间】:2016-10-09 01:51:00
【问题描述】:

我们有一个表,我们在其中使用列来存储商品的价格。列大小为十进制 17.2。我们需要在字符串中同时包含千位分隔符和小数分隔符。我们目前正在使用这个:

SELECT '$' + convert(varchar,cast('2123232322323.21' as money),-1) as Price

但如果大小超过 15 位,则会引发错误。

【问题讨论】:

  • 试试这个 SELECT '$' + convert(varchar,cast('212323232232123.21' as money),-1) as Price
  • 为什么不把格式留给前端呢?如果您需要以欧元显示价格怎么办?或者如果你想在前端排序?
  • @JamesZ 我认为 op 想要添加千位和小数分隔符
  • 您说如果大小超过 15 位会引发错误。这是正常的,因为根据money and smallmoney (Transact-SQL),MONEY 类型的限制是-922,337,203,685,477.5808922,337,203,685,477.5807

标签: sql sql-server sql-server-2005


【解决方案1】:

money 类型没有足够的范围来容纳 OP 正在使用的数字。理想情况下,这种事情会在表示层中完成,但 OP 想要一个 SQL 解决方案,所以我尝试了一个 TSQL 解决方案。 比我有更好的 TSQL 的人可以改进这一点,但我相信它会做 OP 想要的。理想情况下,它将被制成更通用的用户定义函数。它不考虑语言环境(一些欧洲国家使用“.”作为千位分隔符,“,”作为小数点)。

DECLARE @Price decimal(19,2)
DECLARE @PriceString varchar(20)
DECLARE @DP int
DECLARE @Decimals varchar(3)
DECLARE @ResultString varchar(25)

SELECT @Price = 12345678901234567.89
SELECT @PriceString = CONVERT(varchar(20), @Price)
SELECT @DP = CHARINDEX('.', @PriceString)
SELECT @Decimals = SUBSTRING(@PriceString, @DP, LEN(@PriceString)-@DP+1)
SELECT @PriceString = SUBSTRING(@PriceString, 1, @DP-1)
SELECT @PriceString = REVERSE(@PriceString)
DECLARE @ix int
SELECT @ResultString = ''
SELECT @ix = 1
WHILE @ix <= LEN(@PriceString)
BEGIN
    SELECT @ResultString = SUBSTRING(@PriceString, @ix, 1) + @ResultString
    if @ix %3 = 0 AND @ix <> LEN(@PriceString) 
    BEGIN
        SELECT @ResultString = ',' + @ResultString

    END
    SELECT @ix = @ix +1
END
SELECT @ResultString = @ResultString + @Decimals
SELECT @ResultString

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多