Разбить число на триады Ms Sql.

Триады – это блок из трех чисел. Например строка 100 200 151 разбита на разряды, по три символа. Это и есть разбивка на триады.

При работе с бухгалтерскими документами, отчетами, статистическими данными результатом анализа этих документов являются больший суммы.

Когда число содержит более 5 символов – человеку сложно оценить порядок числа, и сделать правильные выводы.

Для этого было придумано форматирование числа, и разбитие его на триады.

Обычно системы формирования отчетов имеют встроенный механизм разбития чисел на разряды и форматирование. Но далеко не всегда.

Тогда возникает необходимость написать функцию для разбивки числа на триады в ms sql server.

Напишем скалярную функцию  ms sql для разбивки суммы на триады.

Будут использованы встроенные функции и один цикл. Данный код работоспособен на ms sql server 2008 и выше.

Откройте среду SQL Server Management Studio (SSMS). Выберите требуемую базу данных. Нажмите “Создать запрос”.

В появившемся окне нужно вставить следующий код.

/*
Функция разбивает число на триады 
*/
CREATE FUNCTION [dbo].[ToTriads](@amount money) 
RETURNS varchar(23)
AS
BEGIN
declare @srcStr varchar(21), --входная строка
@floatStr varchar(3), --дробная часть
@integerStr varchar(18), --целая часть
@pointPos int, --позиция разделителя 
@length int,
@result varchar(21);

set @srcStr = LTRIM(str(@amount, 21, 2)) --преобразует заданное число с плавающей запятой
--где 21 длина результирующей строки, 2 количество знаков после запятой.

set @pointPos = CHARINDEX('.', @srcStr, 1) --определяю позицию точки
set @integerStr = SUBSTRING(@srcStr, 1, LEN(@srcStr) - 3) --целая часть входной строки 
set @floatStr = SUBSTRING(@srcStr, @pointPos, 3) --дробная часть

set @length = LEN(@integerStr) --длина целой части.
set @result = ' ' --результат
--Пока не закончиться строка.
WHILE @length > 0
BEGIN
 --Берем три символа, пробел и формируем итоговую строку. 
 set @result = SUBSTRING(@integerStr, @length - 2, 3) +' '+ @result 
 set @length = @length - 3 --обновляем информацию о длине целой части.
END 
--Формируем итоговую строку из целой и дробной части. Разделитель на выходе - запятая.
set @integerStr = RTRIM(@result) + REPLACE(@floatStr, '.', ',') 
set @srcStr = REPLICATE(' ', 21 - LEN(@integerStr)) + @integerStr -- дополнение пробелами слева.
RETURN @srcStr
END
GO

На вход функция принимает тип money. Максимальное значение 922337203685477.58, или 18 символов.

Длина выходной строки ограничена 21 символом. Легко изменить на требуемое вами значение.

Выходной разделитель дробной части – запятая. 

Результатом работы функции является строка разбитая на три символа(на триады) разделенных пробелом. 

Строка дополняется слева пробелами до длины в 21 символ. Это позволяет выравнивать числа при отображении в data grid. Или при формировании отчетов.

Объявим переменную, которая содержит сумму. Проверим работу только что созданной функции.

declare @amount money = 125907845.15; 
select dbo.ToTriads(@amount) as triads;
 

Узнаем количество символов в строке, выполнив 

select LEN(dbo.ToTriads(@amount)) as strLen;

Функция разбивки числа на триады будет полезна когда вы получаете готовые данные из базы данных ms sql server и отображаете их пользователю.

Это могут быть старые десктопные программы, написанные на С++. Или простые системы формирования отчетов.