Форматирование десятичной дроби с нулями - PullRequest
0 голосов
/ 24 марта 2020

У меня есть требование, которое гласит, что оно должно быть округлено до двух знаков после запятой и должно содержать 8 цифр.

   Output Example:
   1234567.88  to 12345678  -- As format is only for 8 digit by removing decimal
   123.45      to 00012345
   748.55137   to 00074855

Для этого я сделал ниже способ, в котором FORMAT или LEFT не работает.

SELECT REPLACE(RIGHT('00000000'+LEFT(CAST(CAST( ROUND((((ISNULL(511.90,0)*(ISNULL(146.230,0)/100))),2) AS DECIMAL( 15,0)) AS VARCHAR( 15 )), 8 ), 8 ),'.','')
 Expected Output: 00074855 

Я сделал LEFT, FORMAT(.., '00000.00'), но, похоже, здесь ничего не работает в CASE.

Спасибо всем за входные данные.

Working Sample: 

REPLACE(FORMAT(CAST(ROUND(((ISNULL(511.90,0) * (ISNULL(146.230,0)/100))),2) AS DECIMAL(10,2)),'000000.00'),'.','')

Ответы [ 4 ]

1 голос
/ 24 марта 2020

Оператор SELECT LEFT(FORMAT(Amount * 100, '00000000'), 8), используя LEFT () и FORMAT () с пользовательской строкой форматирования , возвращает ожидаемые результаты:

Оператор:

SELECT 
   Amount, 
   LEFT(FORMAT(Amount * 100, '00000000'), 8) AS FormattedAmount
FROM (
   VALUES (1234567.88), (123.45), (748.55137)
) v (Amount)

Результат:

Amount          FormattedAmount
1234567.88000   12345678
123.45000       00012345
748.55137       00074855
0 голосов
/ 24 марта 2020

Вы можете просто использовать LEFT для заполнения нулей, REPLACE для удаления точки и CONVERT для преобразования значения из строки в число следующим образом: -

SELECT LEFT('00000000'+ CONVERT(int,REPLACE('1234567.88', '.', '')),8) -- output: 12345678

SELECT Right('00000000'+ Convert(varchar(8), Convert(int,REPLACE('123.45', '.', ''))),8) -- output: 00012345
0 голосов
/ 24 марта 2020

Номер ввода: 1234567,88 в десятичном / числовом формате c

SELECT RIGHT( '00000000' + LEFT( CAST( CAST( 1234567.88 * 100 AS DECIMAL( 15, 0 )) AS VARCHAR( 15 )), 8 ), 8 )

Выход: 12345678

Как это работает:

  1. CAST( 1234567.88 * 100 AS DECIMAL( 15, 0 )) - преобразование с меньшей точностью автоматически округляет число (см. Преобразование десятичной дроби и цифры c data )
  2. CAST( ... VARCHAR( 15 )) - приведение к строке
  3. LEFT( ... , 8 ) - усечение число до 8 цифр
  4. RIGHT( '00000000' + ... , 8 ) - добавить начальные нули, затем усечь, сохранив 8 крайних правых символов

FYI: если вы используете десятичное число / цифру c форматы для ваших расчетов, тогда нет необходимости в «смешных» делениях и умножениях чисел (/.05)*.05).

0 голосов
/ 24 марта 2020

Вы можете попробовать это, используя REPLICATE (Transact- SQL) .

Здесь 8 - необходимая длина текста, включая отступы 0.

declare @id as varchar(10) = replace('1234567.88', '.', '')
SELECT Convert(Varchar(8),CONCAT(REPLICATE('0', 8 - LEN(@id)), @id)) as AfterPadding

set @id = replace('123.45', '.', '')
SELECT Convert(Varchar(8),CONCAT(REPLICATE('0', 8 - LEN(@id)), @id)) as AfterPadding

Live db <> fiddle demo.

Для вашей таблицы вам необходимо подать заявление следующим образом.

Select 
     Convert(Varchar(8),
     CONCAT(REPLICATE('0', 8 - LEN(Replace(Cast(AMOUNT as Varchar(10)), '.', ''))), 
     Replace(Cast(AMOUNT as Varchar(10)), '.', ''))
     ) as AmountInText
from SampleDataTable

Live дБ <> скрипка демо.

...