2016-05-04 3 views
1

У меня есть следующий список Amount (float) в моей таблице.Получить число цифр после десятичной точки поплавка (с десятичной запятой или без нее)

Amount 
123 
123.1 
123.
123.789456 

Как я могу получить число цифр после десятичной точки.

Дубликат: я проверил уже существующие сообщения, но не правильный способ справиться с float номера with or without decimal part.

Результат

Amount  Result 
123   0 
123.1  1 
123.
123.789456 6 

EDIT: Пробыв некоторое ценное время, я нашел некоторые относительно простой скрипт справиться с этим. Мой ответ below

+2

Возможный дубликат [Как подсчитать знаков после запятой в SQL?] (HTTP: // переполнение стека.com/questions/14715141/how-do-i-count-decimal-places-in-sql) – artm

+0

select len ​​(подстрока ('123.789456', charindex ('.', '123.789456') + 1, len ('123.789456'))) – KumarHarsh

+0

@artm, Тип данных, если плавающий. declare @v float set @ v = 0.0012 выберите SQL_VARIANT_PROPERTY (@v, 'Scale') как Scale, result = 0 ?? –

ответ

1

Для этого я нашел простой скрипт (относительно меня).

ISNULL(NULLIF(CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))),0) - 1,0) 

Здесь ISNULL(NULLIF только обрабатывать поплавок без дробной части. Если нет значения без дробной части, то это очень просто

CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))) -1 

Надеется, что это будет полезно для вас. Полный сценарий ниже

declare @YourTable table (Amount float) 
insert into @YourTable 
values(123),(123.1),(123.0123),(123.789456) 

SELECT ISNULL(NULLIF(CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))),0) - 1,0) 
FROM @YourTable 

SELECT CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))) -1 
FROM @YourTable 
3

Вы можете сделать это в следующем:

QUERY

SELECT Amount, 
     CASE WHEN FLOOR(Amount) <> CEILING(Amount) THEN LEN(CONVERT(INT,CONVERT(FLOAT,REVERSE(CONVERT(VARCHAR(50), Amount, 128))))) ELSE 0 END AS Result 
FROM YourTable 

Ouput

Amount  Result 
123   0 
123,1  1 
123,
123,789456 6 
+1

Это не удастся, если поплавок не имеет десятичного числа. 'DECLARE @Float FLOAT = 123; SELECT LEN (CONVERT (INT, CONVERT (FLOAT, REVERSE (CONVERT (VARCHAR (50), @float, 128))))) в качестве результата; ' – Arulkumar

+0

@Arulkumar благодарит вас за ваше уведомление, исправлено It, обновленный ответ. –

+1

Да, его работа, thankx @ StanislovasKalašnikovas –

1

Abdul Спасибо за указание свою ошибку. Я не знал о поведении флота.

declare @t table(Amount float) 
insert into @t values (123),(123.1),(123.0123),(123.789456) 

Вот видите эта линия будет делать трюк,

select CONVERT (VARCHAR(50), amount,128) from @t 

Полный сценарий,

select col ,case when len(col)>0 then len(col) else 0 end newcol from 
(SELECT substring(REVERSE(CONVERT (VARCHAR(50), amount,128)),0, 
charindex('.',REVERSE(CONVERT (VARCHAR(50), amount,128)))) col from @t)t4 
+0

Результат неверен для (123.0123,123.789456)). –

0

Этот код будет, безусловно, поможет вам.

SELECT Amount, 
     LEN(SUBSTRING(CAST(Amount as VARCHAR),CHARINDEX('.',CAST(Amount as VARCHAR))+1,LEN(Amount))) Result 
FROM [Your Table Name] 
+0

Результат неправильный, если нет десятичного числа –

0

И еще один способ:

SELECT Amount, 
     CASE WHEN deci = 0 THEN 0 ELSE LEN(deci) END AS Result 
FROM (
    SELECT Amount, 
      TRY_CAST(REVERSE(REPLACE(Amount - TRY_CAST(Amount as int),'0.','')) as int) as deci 
    FROM (VALUES 
    (123), 
    (123.1), 
    (123.0123), 
    (123.789456) 
    ) as t (Amount) 
) as t 

Выход:

Amount  Result 
123.000000 0 
123.100000 1 
123.
123.789456 6 
+0

Спасибо за ваш повтор, хороший, но мой один относительно прост, я думаю (до сих пор), а затем @Stanislovas Kalašnikovas ответ. –

+1

Мое удовольствие! Я видел ваш ответ после публикации моего ответа, он выглядит намного проще. – gofr1

Смежные вопросы