Как преобразовать float в varchar в SQL Server

У меня есть float-столбец с номерами различной длины, и я пытаюсь преобразовать их в varchar.

Некоторые значения превышают максимальный размер maxint, поэтому я не могу сделать что-то вроде этого

cast(cast(float_field as bigint) as varchar(100))

Я пробовал использовать десятичное число, но числа не имеют одинакового размера, поэтому это тоже не помогает

CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))

Любая помощь приветствуется.

UPDATE:

Значение выборки 2.2000012095022E + 26.

Ответ 1

Попробуйте использовать функцию STR().

SELECT STR(float_field, 25, 5)

Функция STR()


Другое примечание: эти прокладки слева с пробелами. Если проблема связана с LTRIM:

SELECT LTRIM(STR(float_field, 25, 5))

Ответ 2

Единственный бит запроса, который я нашел, который возвращает ТОЧНО, тот же оригинальный номер

CONVERT (VARCHAR(50), float_field,128)

См. http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html

Другие вышеприведенные решения иногда будут округлять или добавлять цифры в конце

ОБНОВЛЕНИЕ. В соответствии с приведенными ниже комментариями и тем, что я вижу в https://msdn.microsoft.com/en-us/library/ms187928.aspx:

CONVERT (VARCHAR(50), float_field,3)

Должны использоваться в новых версиях SQL Server (база данных Azure SQL и запуск в SQL Server 2016 RC3)

Ответ 3

это решение, которое я использовал в sqlserver 2012 (так как у всех других предложений был недостаток усечения дробной части или какой-то другой недостаток).

declare @float float = 1000000000.1234;
select format(@float, N'#.##############################');

выход:

1000000000.1234

у этого есть еще одно преимущество (в моем случае), чтобы облегчить сепаратор тысяч и локализацию:

select format(@float, N'#,##0.##########', 'de-DE');

выход:

1.000.000.000,1234

Ответ 4

Сначала конвертируйте в integer, а затем в string:

cast((convert(int,b.tax_id)) as varchar(20))

Ответ 5

float имеет только макс. точность 15 цифр. Поэтому цифры после 15-й позиции являются случайными, и преобразование в bigint (максимум 19 цифр) или десятичное значение не помогает вам.

Ответ 6

Полезная тема.

Если вы хотите, чтобы я удалял ноты нуля, вы можете использовать это:

DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(STR(@MyFloat, 38, 16), '0', ' '))), ' ', '0'),'.',' ')),' ',',')

Ответ 7

Это может помочь без округления

declare @test float(25)

declare @test1 decimal(10,5)

select @test = 34.0387597207
select @test
set @test1 = convert (decimal(10,5), @test)
select cast((@test1) as varchar(12))


Select  LEFT(cast((@test1) as varchar(12)),LEN(cast((@test1) as varchar(12)))-1)

Ответ 8

Если вы используете функцию CLR, вы можете преобразовать float в строку, которая выглядит так же, как float, без лишних 0 в конце.

Функция CLR

[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
[return: SqlFacet(MaxSize = 50)]
public static SqlString float_to_str(double Value, int TruncAfter)
{
  string rtn1 = Value.ToString("R");
  string rtn2 = Value.ToString("0." + new string('0', TruncAfter));

  if (rtn1.Length < rtn2.Length) { return rtn1; } else { return rtn2; }
}

.

Пример

create table #temp (value float)
insert into #temp values (0.73), (0), (0.63921), (-0.70945), (0.28), (0.72000002861023), (3.7), (-0.01), (0.86), (0.55489), (0.439999997615814)

select value,
       dbo.float_to_str(value, 18) as converted,
       case when value = cast(dbo.float_to_str(value, 18) as float) then 1 else 0 end as same
from   #temp

drop table #temp

.

Выход

value                  converted                  same
---------------------- -------------------------- -----------
0.73                   0.73                       1
0                      0                          1
0.63921                0.63921                    1
-0.70945               -0.70945                   1
0.28                   0.28                       1
0.72000002861023       0.72000002861023           1
3.7                    3.7                        1
-0.01                  -0.01                      1
0.86                   0.86                       1
0.55489                0.55489                    1
0.439999997615814      0.439999997615814          1

.

Caveat

Все преобразованные строки усекаются в 18 десятичных разрядов, и нет нулевых нулей. 18 цифр точности не проблема для нас. И 100% наших номеров FP (около 100 000 значений) выглядят идентичными строковым значениям, как в базе данных, как номера FP.

Ответ 9

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

DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;

SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM((REPLACE(CAST(CAST(@MyFloat AS DECIMAL(38,18)) AS VARCHAR(max)), '0', ' '))), ' ', '0'),'.',' ')),' ','.')

Ответ 10

select replace(myFloat, '', '')

из REPLACE() документация:

Возвращает nvarchar, если один из входных аргументов имеет тип данных nvarchar; в противном случае REPLACE возвращает varchar.
Возвращает NULL, если любой из аргументов равен NULL.

тесты:
null == > [NULL]
1.11 == > 1.11
1.10 == > 1.1
1.00 == > 1
0.00 == > 0
-1.10 == > -1.1
0,00001 == > 1e-005
0.000011 == > 1.1e-005

Ответ 11

Выбрать
cast (replace (convert (decimal (15,2), acs_daily_debit), '.', ',') как varchar (20))

из acs_balance_details

Ответ 12

Попробуйте это, нужно работать:

cast((convert(bigint,b.tax_id)) as varchar(20))

Ответ 13

Основываясь на молекулярном ответе:

DECLARE @F FLOAT = 1000000000.1234;
SELECT @F AS Original, CAST(FORMAT(@F, N'#.##############################') AS VARCHAR) AS Formatted;

SET @F = 823399066925.049
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;

SET @F = 0.502184537571209
SELECT @F AS Original, CAST(@F AS VARCHAR) AS Formatted
UNION ALL SELECT @F AS Original, CONVERT(VARCHAR(128), @F, 128) AS Formatted
UNION ALL SELECT @F AS Original, CAST(FORMAT(@F, N'G') AS VARCHAR) AS Formatted;