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

Я знаю, что это можно сделать тривиально в среде, отличной от 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 ]

14 голосов
/ 28 января 2010

Как насчет:

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

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

4 голосов
/ 28 января 2010

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

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 голосов
/ 12 ноября 2014

Для контролируемого форматирования чисел в 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])

Значением аргумента является вашчисло.Аргументом формата является строка форматирования типа CLR (в этом примере я указал «нормальное число, нулевая точность»).Необязательный аргумент культуры позволяет переопределить настройку культуры сервера для форматирования числа в соответствии с желаемой культурой.

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

0 голосов
/ 15 июля 2016

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

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

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

0 голосов
/ 06 апреля 2014

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

0 голосов
/ 12 сентября 2012

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

0 голосов
/ 28 января 2010

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

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

0 голосов
/ 28 января 2010

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

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)
0 голосов
/ 28 января 2010

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

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...