如何在SQL Server中将float转换为varchar

我有一个不同长度的数字的浮动列,我试图将它们转换为varchar。

有些值超过了最大大小,所以我不能做这样的事情

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

我试过使用十进制,但数字不是相同的大小,所以这也没有帮助

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

任何帮助表示赞赏。

更新:

示例值是2.2000012095022E + 26

尝试使用STR()函数。

 SELECT STR(float_field, 25, 5) 

STR()函数


另一个注意事项:这个垫在左边的空格。 如果这是与LTRIM结合的问题:

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

唯一的查询位,我发现返回EXACT相同的原始数字是

 CONVERT (VARCHAR(50), float_field,128) 

请参阅http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html

上面的其他解决scheme有时会循环或添加数字

更新 :根据下面的评论和我可以看到在https://msdn.microsoft.com/en-us/library/ms187928.aspx

 CONVERT (VARCHAR(50), float_field,3) 

应该用在新的SQL Server版本(Azure SQL数据库,并从SQL Server 2016 RC3开始)

这是我最终在sqlserver 2012中使用的解决scheme(因为所有其他的build议有截断小数部分或其他缺点的缺点)。

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

输出:

 1000000000.1234 

这有进一步的优势(在我的情况下)使千位分隔符和本地化变得简单:

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

输出:

 1.000.000.000,1234 

浮动只有一个最大值。 精度为15位。 因此,第15位之后的数字是随机的,转换为bigint(最多19位数字)或小数点不会帮助您。

有用的主题谢谢。

如果你想像我一样删除前导零你可以使用:

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

这可以帮助不四舍五入

 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) 

首先转换成一个integer ,然后转换成一个string

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

如果您使用CLR函数,则可以将float转换为与float类似的string,而不会在末尾添加所有额外的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 

警告

所有转换的string都被截断为十进制小数点后18位,并且没有尾随零。 18位精度对我们来说不是问题。 而且,我们的FP编号(接近100,000个值)的100%看起来与string值相同,就像它们在数据库中与FP编号一样。

修改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'),'.',' ')),' ','.') 
 select replace(myFloat, '', '') 

来自REPLACE()文档 :

如果其中一个input参数是nvarchar数据types,则返回nvarchar; 否则,REPLACE返回varchar。
如果其中任何一个参数为NULL,则返回NULL。

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

select
将var(20)replace(convert(decimal(15,2),acs_daily_debit),'。',','))

来自acs_balance_details

尝试这个,应该工作:

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

根据分子的答案:

 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;