Есть ли простой способ форматирования десятичных знаков в T-SQL?

Я знаю, что это можно было бы сделать тривиально в среде, отличной от 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 и вручную обрезаны персонажи, но я хотел знать, было ли более элегантное решение.

Ответ 1

Как насчет:

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

Однако сначала вы можете проверить это с помощью исходных данных.

Ответ 2

Этот способ довольно прост:

DECLARE @Number DECIMAL(5,2)

SELECT @Number = 123.65

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

Возвращает '124'.

Единственное, что нужно учитывать, - это вы хотите округлить вверх/вниз или просто сбрасывать нули и десятичные точки без округления; вы делали бы DECIMAL как INT во втором случае.

Ответ 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 (в этом примере я указал "нормальное число, нулевую точность" ). Необязательный аргумент культуры позволяет переопределить настройку культуры сервера для форматирования числа в соответствии с желаемой культурой.

См. также страницу ссылки MSDN для FORMAT().

Ответ 4

Функция Convert может делать то, что вы хотите сделать.

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

Ответ 5

Позвольте мне попробовать это снова....

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)

Ответ 6

Вы можете разбить конечные нули в цикле 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, это легче сделать на стороне клиента.

Ответ 7

Простой и элегантный? Не так много... но это 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
    )

Ответ 8

Используйте функцию Формат (значение, формат, культура) в SQL Server 2012 +

Ответ 9

Если у вас есть SQL Server 2012 или Greater, вы можете использовать функцию формата следующим образом:

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

Конечно, функция format вернет nvarchar, а не varchar. Вы можете использовать для получения определенного типа.

Ответ 10

Кроме того, посмотрите на функцию T-SQL STR в Books Online; это можно использовать для форматирования поплавков и может работать для вашего дела. По какой-то причине он не возникает в поисковых запросах Google, связанных с этой проблемой.