如何在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;