在SQL Server中格式化十进制的好方法

时间:2010-05-17 16:58:11

标签: sql sql-server tsql formatting decimal

我们在数据库中存储小数(9,8)。它可以在小数点后面有任意数量的位置(好吧,不超过8)。我很沮丧,因为我想将它显示为人类可读的文本,作为在服务器上创建的更大字符串的一部分。我希望小数点右边的小数与非零一样多,例如:

0.05
0.12345
3.14159265

一切都很好

如果我这样做

CAST(d AS varchar(50)) 

我的格式如下:

0.05000000
0.12345000
3.14159265

如果我在转换为varchar之前转换/转换为float或其他类型,我会得到类似的输出。我知道如何做一个固定数量的小数位,例如:

0.050
0.123
3.142

但这不是我想要的。

是的,我知道我可以通过复杂的字符串操作(REPLACE等)来做到这一点,应该有一个很好的方法来做到这一点。

3 个答案:

答案 0 :(得分:2)

玩游戏(sql server)我发现第一次浮动才能解决问题..

select cast( cast(0.0501000 as float) as varchar(50) )

产量

0.0501

答案 1 :(得分:2)

Code copied almost verbatim from here(还讨论了模式0中浮点格式化的6位数限制):

DECLARE @num3 TABLE (i decimal(9, 8))

INSERT  @num3
        SELECT  0.05
        UNION ALL
        SELECT  0.12345
        UNION ALL
        SELECT  3.14159265 
SELECT  i
       ,CASE WHEN PATINDEX('%[1-9]%', REVERSE(i)) < PATINDEX('%.%', REVERSE(i))
             THEN LEFT(i, LEN(i) - PATINDEX('%[1-9]%', REVERSE(i)) + 1)
             ELSE LEFT(i, LEN(i) - PATINDEX('%.%', REVERSE(i)))
        END 'Converted'
FROM    @num3

答案 2 :(得分:0)

除了相当直接的操作之外的其他任何东西,我都会考虑在你的调用代码中执行此操作而不是tbh,因为我认为通常最好让SQL从数据库中按原样返回数据,然后保留格式这取决于任何调用它的东西,这可能更适合字符串操作。特别是如果你发现自己跳起来试图实现它。