str float ejemplos ejemplo convertir convert cast sql-server-2008

sql server 2008 - ejemplos - Cómo convertir float a varchar en SQL Server



convertir float a varchar sql server 2008 (13)

Basado en la respuesta molecular:

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;

Tengo una columna flotante con números de diferente longitud y estoy tratando de convertirlos a varchar.

Algunos valores superan el tamaño máximo de bigint, por lo que no puedo hacer algo como esto

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

He intentado usar decimal, pero los números no son del mismo tamaño, así que esto tampoco ayuda

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

Cualquier ayuda es apreciada.

ACTUALIZAR:

El valor de muestra es 2.2000012095022E + 26 .


Convierte primero en un integer y luego en una string :

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


El único bit de consulta que encontré que devuelve el EXACTO es el mismo número original

CONVERT (VARCHAR(50), float_field,128)

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

Las otras soluciones anteriores a veces redondean o agregan dígitos al final

ACTUALIZACIÓN : según los comentarios a continuación y lo que puedo ver en https://msdn.microsoft.com/en-us/library/ms187928.aspx :

CONVERT (VARCHAR(50), float_field,3)

Se debe usar en nuevas versiones de SQL Server (Base de datos SQL de Azure y comenzando en SQL Server 2016 RC3)


Esto puede ayudar sin redondear

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)


Intenta usar la función STR() .

SELECT STR(float_field, 25, 5)

Función STR ()

Otra nota: estas almohadillas a la izquierda con espacios. Si esto es un problema combínelo con LTRIM :

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


La respuesta modificada de Axel un poco, ya que en ciertos casos producirá resultados no deseados.

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''),''.'','' '')),'' '',''.'')


Prueba esto, debería funcionar:

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


Seleccionar
cast (replace (convert (decimal (15,2), acs_daily_debit), ''.'', '','') como varchar (20))

de acs_balance_details


Si utiliza una función CLR, puede convertir el flotador en una cadena que se parece al flotador, sin todos los 0 adicionales al final.

Función 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; } }

.

Ejemplo

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

.

Salida

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

.

Advertencia

Todas las cadenas convertidas se truncan con 18 decimales, y no hay ceros al final. 18 dígitos de precisión no son un problema para nosotros. Y, el 100% de nuestros números FP (cerca de 100.000 valores) se ven idénticos a los valores de cadena como lo hacen en la base de datos como números FP.


Tema útil gracias.

Si quieres que yo quite las indicaciones cero, puedes usar eso:

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


esta es la solución que terminé usando en sqlserver 2012 (ya que todas las otras sugerencias tenían el inconveniente de truncar parte fraccionaria o algún otro inconveniente).

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

salida:

1000000000.1234

esto tiene la ventaja adicional (en mi caso) de facilitar el separador de miles y la localización:

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

salida:

1.000.000.000,1234


float solo tiene un max. precisión de 15 dígitos Los dígitos después de la posición 15 son por lo tanto aleatorios, y la conversión a letra grande (máximo 19 dígitos) o decimal no lo ayuda.


select replace(myFloat, '''', '''')

de la documentación REPLACE () :

Devuelve nvarchar si uno de los argumentos de entrada es del tipo de datos nvarchar; de lo contrario, REPLACE devuelve varchar.
Devuelve NULL si alguno de los argumentos es NULL.

pruebas:
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