有没有简单的方法来格式化T-SQL中的小数?

时间:2010-01-27 21:48:02

标签: sql tsql

我知道它可以在非SQL环境中轻松完成[后期数据处理,前端,你有什么],但目前还不可能。有没有办法取decimal(5,2)并将其转换为varchar而没有尾随零/小数点?例如:

declare @number decimal(5,2)
set @number = 123.00
select cast(@number as varchar) as FormattedNumber

结果是'123.00'。是否有(简单)方法来获得'123'?同样,而不是'123.30','123.3'?可以通过弄清楚百分之十/十分位数是否为0并手动修剪字符来做到这一点,但我想知道是否有更优雅的解决方案。

10 个答案:

答案 0 :(得分:14)

怎么样:

SELECT CAST(CAST(@number AS float) AS varchar(10))

但是,您可能需要先仔细测试原始数据。

答案 1 :(得分:4)

这种方式非常简单:

DECLARE @Number DECIMAL(5,2)

SELECT @Number = 123.65

SELECT FormattedNumber = CAST(CAST(@Number AS DECIMAL(3,0)) AS VARCHAR(4))

返回'124'。

唯一要考虑的是你是想要向上/向下舍入,还是只删除零和小数点而不进行舍入;你会在第二种情况下将DECIMAL强制转换为INT。

答案 2 :(得分:3)

对于T-SQL中数字的受控格式,您应该使用FORMAT()函数。例如:

DECLARE @number DECIMAL(9,2); SET @number = 1234567.12;
DECLARE @formatted VARCHAR(MAX); SET @formatted = FORMAT(@number, 'N0', 'en-AU');
PRINT @formatted;

结果将是:

1,234,567

FORMAT()函数的参数是:

FORMAT(value, format [, culture])

value参数是您的号码。 format参数是一个CLR类型的格式化字符串(在本例中,我指定了“正常数,零精度”)。可选的culture参数允许您覆盖服务器区域设置,以根据所需的区域设置格式化数字。

另见the MSDN ref page for FORMAT()

答案 3 :(得分:0)

转换功能可以做你想做的事。

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm

答案 4 :(得分:0)

让我再试一次......

CREATE FUNCTION saneDecimal(@input decimal(5,2)) returns varchar(10)
AS
BEGIN
DECLARE @output varchar(10)
SET @output = CAST(@input AS varchar(10))

DECLARE @trimmable table (trimval char(1))
INSERT @trimmable VALUES ('0')
INSERT @trimmable VALUES ('.')

WHILE EXISTS (SELECT * FROM @trimmable WHERE trimval = CAST(SUBSTRING(@output, LEN(@output), 1) AS char(1)))
    SET @output = LEFT(@output, LEN(@output) - 1)

RETURN @output
END

GO

SELECT dbo.saneDecimal(1.00)

答案 5 :(得分:0)

您可以在while循环中删除尾随零:

declare @number decimal(5,2)
declare @str varchar(100)
set @number = 123.00
set @str = @number
while substring(@str,len(@str),1) in ('0','.',',')
    set @str = substring(@str,1,len(@str)-1)

但正如AdaTheDev评论的那样,客户端更容易做到这一点。

答案 6 :(得分:0)

简单而优雅?不是那么多......但那是你的T-SQL:

DECLARE @number decimal(5,2) = 123.00
DECLARE @formatted varchar(5) = CAST(@number as varchar)

SELECT 
    LEFT(
        @formatted,
        LEN(@formatted)
            - PATINDEX('%[^0.]%', REVERSE(@formatted)) 
            + 1
    )

答案 7 :(得分:0)

使用SQL Server 2012 +中的格式(值,格式字符串,区域性)功能

答案 8 :(得分:0)

如果您有SQL Server 2012或更高版本,则可以使用以下格式函数:

select format(@number,'0') as FormattedNumber

格式函数当然会返回一个nvarchar,而不是一个varchar。您可以强制转换以获取特定类型。

答案 9 :(得分:-2)

另外,看看联机丛书中的T-SQL STR功能;这可以用于格式化浮动,可能适用于您的情况。出于某种原因,它不会出现与此问题有关的Google搜索。