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)
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