Ответ 1
Как насчет:
SELECT CAST(CAST(@number AS float) AS varchar(10))
Однако сначала вы можете проверить это с помощью исходных данных.
Я знаю, что это можно было бы сделать тривиально в среде, отличной от 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 и вручную обрезаны персонажи, но я хотел знать, было ли более элегантное решение.
Как насчет:
SELECT CAST(CAST(@number AS float) AS varchar(10))
Однако сначала вы можете проверить это с помощью исходных данных.
Этот способ довольно прост:
DECLARE @Number DECIMAL(5,2)
SELECT @Number = 123.65
SELECT FormattedNumber = CAST(CAST(@Number AS DECIMAL(3,0)) AS VARCHAR(4))
Возвращает '124'.
Единственное, что нужно учитывать, - это вы хотите округлить вверх/вниз или просто сбрасывать нули и десятичные точки без округления; вы делали бы DECIMAL как INT во втором случае.
Для управляемого форматирования чисел в 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()
.
Функция Convert может делать то, что вы хотите сделать.
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm
Позвольте мне попробовать это снова....
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)
Вы можете разбить конечные нули в цикле 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, это легче сделать на стороне клиента.
Простой и элегантный? Не так много... но это 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
)
Используйте функцию Формат (значение, формат, культура) в SQL Server 2012 +
Если у вас есть SQL Server 2012 или Greater, вы можете использовать функцию формата следующим образом:
select format(@number,'0') as FormattedNumber
Конечно, функция format вернет nvarchar, а не varchar. Вы можете использовать для получения определенного типа.
Кроме того, посмотрите на функцию T-SQL STR в Books Online; это можно использовать для форматирования поплавков и может работать для вашего дела. По какой-то причине он не возникает в поисковых запросах Google, связанных с этой проблемой.