在没有科学计数法的 SQL Server 中将 float 转换为 varchar
Posted
技术标签:
【中文标题】在没有科学计数法的 SQL Server 中将 float 转换为 varchar【英文标题】:Convert float into varchar in SQL Server without scientific notation 【发布时间】:2011-06-29 13:24:09 【问题描述】:在 SQL Server 中将 float 转换为 varchar,无需科学记数法和修剪小数。
例如:
我有浮点值1000.2324422,然后它会被转换成varchar,和1000.2324422一样。
可能有任意数量的十进制值...浮点值随机出现。
【问题讨论】:
Why casting from float to varchar is being rounded in SQL Server的可能重复 【参考方案1】:转换或转换为VARCHAR(MAX)
或其他任何不 对我使用大整数(在浮点字段中)如 167382981(总是出现'1.67383e+008')工作的方法。
做了工作的是STR()
。
【讨论】:
这更好,但实际上我必须执行 LTRIM(STR(someField)),因为默认情况下它会返回一个 VARCHAR(10),如果数字没有 10 位,则用空格填充 由于某种原因,在 sql 2008 r2 上,当我在 12 位数字值上使用 STR() 时,我得到了 ******* 值。我不得不改用@Chris 的方法 这不适用于负值。因为我只处理整数,所以我能够使用 CAST(CAST([value] as INT)AS NVARCHAR(10))【参考方案2】:str()
或 cast(float as nvarchar(18))
都不适合我。
最终的工作是转换为 int,然后转换为 nvarchar,如下所示:
convert(nvarchar(18),convert(bigint,float))
【讨论】:
cast(cast(fieldname as bigint) as nvarchar(18))
也是一个选项。
转换为 Int 会很快让你陷入溢出,如上所述,bigint 更好!
@JPHellemons 非常感谢,这节省了我完成工作的时间!
你传递了一个浮点数(就像提问者问的那样),但这仅适用于整数。
JP Hellemons 你的演员阵容为我工作。【参考方案3】:
STR 功能很好用。在进行了一些计算后,我得到了一个浮点数,需要更改为 VARCHAR,但我也随机获得了科学记数法。经过所有的计算,我做了这个转换:
ltrim(rtrim(str(someField)))
【讨论】:
这很有帮助。另外,请注意 str 的默认长度为 10。因此,如果您分配给小于此长度的固定长度 varchar,它将被截断。例如:声明@x varchar(9) = str(1);将分配 9 个空格给 @x 我将我的字段包含在 str(field) 中,并且一切正常。谢谢:) 是的,我使用相同的解决方案,但我也指定精度,如这篇文章:***.com/questions/3715675/… 对我来说,str
适用于整数值,但它会将非整数值四舍五入到最接近的 int。所以str(0.2)
返回0
。这在 MSSQL 2008 R2 上。【参考方案4】:
试试CAST(CAST(@value AS bigint) AS varchar)
【讨论】:
但这仅适用于整数,而提问者询问浮点数。【参考方案5】:这行得通:
CONVERT(VARCHAR(100), CONVERT(DECIMAL(30, 15), fieldname))
【讨论】:
【参考方案6】:由于小数的原因,这与此特定情况无关,但可能会对搜索标题的人有所帮助。 整数字段可以很好地转换为 varchars,但浮点数会转换为科学记数法。因此,如果您没有小数,快速更改浮点数的一种非常快速的方法是先将字段更改为整数,然后将其更改为 varchar。
【讨论】:
你能举个例子吗?【参考方案7】:试试这个:
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(CAST(CAST(YOUR_FLOAT_COLUMN_NAME AS DECIMAL(18,9)) AS VARCHAR(20)),'0',' ')),' ','0'),'.',' ')),' ','.') FROM YOUR_TABLE_NAME
-
转换为 DECIMAL 将在每个值上加上小数点,无论是
之前有没有。
转换为 VARCHAR 允许您使用 REPLACE 函数
首先用空格替换零,然后用 RTRIM 删除所有尾随空格(以前的零),然后用零替换剩余的空格。
然后对句点执行相同操作,以消除没有小数值的数字。
【讨论】:
太棒了!这是我见过的唯一能正确处理非整数值的解决方案,并且不会用前导或尾随零或空格来破坏结果。我创建了一个用户定义的函数来做到这一点。我应该编辑答案以将其作为函数定义给出吗?【参考方案8】:下面是一个例子,我们可以在没有任何科学记数法的情况下转换浮点值。
DECLARE @Floater AS FLOAT = 100000003.141592653
SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
,STR(@Floater)
,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
SET @Floater = @Floater * 10
SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
,STR(@Floater)
,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
SET @Floater = @Floater * 100
SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
,STR(@Floater)
,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
SELECT LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
,FORMAT(@Floater, '')
在上面的例子中,我们可以看到格式化函数对我们很有用。 FORMAT() 函数总是返回 nvarchar。
【讨论】:
【参考方案9】:我有另一个解决方案,因为 STR() 函数会产生一些空格,所以我使用 FORMAT() 函数作为以下示例:
SELECT ':' + STR(1000.2324422), ':' + FORMAT(1000.2324422,'##.#######'), ':' + FORMAT(1000.2324422,'##')
以上代码的结果是:
: 1000 :1000.2324422 :1000
【讨论】:
【参考方案10】:您可以使用此代码:
STR(<Your Field>, Length, Scale)
您的字段 = 用于转换的浮动字段
长度 = 带小数点的浮点数的总长度
比例 = 小数点后的长度数
例如:
SELECT STR(1234.5678912,8,3)
结果是:1234.568
请注意,最后一位数字也是向上取整的。
【讨论】:
【参考方案11】:您必须非常好地测试您的数据。这可能会变得混乱。这是一个简单地将值乘以 10 的结果示例。运行它来看看会发生什么。 在我的 SQL Server 2017 机器上,在第三个查询中,我得到了一堆 *********。如果您 CAST as BIGINT 它应该每次都有效。但是,如果您不测试并且没有测试足够的数据,您以后可能会遇到问题,所以不要误以为它会对您的所有数据都有效,除非您测试最大预期值。
Declare @Floater AS FLOAT =100000003.141592653
SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ),
CONVERT(VARCHAR(100),ROUND(@Floater,0)),
STR(@Floater)
SET @Floater =@Floater *10
SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ),
CONVERT(VARCHAR(100),ROUND(@Floater,0)),
STR(@Floater)
SET @Floater =@Floater *100
SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ),
CONVERT(VARCHAR(100),ROUND(@Floater,0)),
STR(@Floater)
【讨论】:
你能比“这会变得一团糟”和“遇到问题”更具体吗?究竟会发生什么?示例的结果是什么?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。【参考方案12】:有很多答案,但没有一个足够完整,无法适应将FLOAT
转换为NVARCHAR
的场景,所以我们来了。
这就是我们最终的结果:
DECLARE @f1 FLOAT = 4000000
DECLARE @f2 FLOAT = 4000000.43
SELECT TRIM('.' FROM TRIM(' 0' FROM STR(@f1, 30, 2))),
TRIM('.' FROM TRIM(' 0' FROM STR(@f2, 30, 2)))
SELECT CAST(@f1 AS NVARCHAR),
CAST(@f2 AS NVARCHAR)
输出:
------------------------------ ------------------------------
4000000 4000000.43
(1 row affected)
------------------------------ ------------------------------
4e+006 4e+006
(1 row affected)
在我们的场景中,FLOAT
是一美元到小数点后 2 位就足够了,但您可以根据需要轻松增加它。
此外,我们需要为整数修剪“.00”。
【讨论】:
【参考方案13】:试试这个代码
SELECT CONVERT(varchar(max), CAST(1000.2324422 AS decimal(11,2)))
结果:
1000.23
这里decimal(11,2):11位总位数(不带小数点),2 - 小数点后两位
【讨论】:
【参考方案14】:我之前的答案都没有。最后我只是简单地使用了这个:
INSERT INTO [Destination_Table_Name]([Field_Name])
SELECT CONCAT('#',CAST([Field_Name] AS decimal(38,0))) [Field_Name]
FROM [dbo].[Source_Table_Name] WHERE ISNUMERIC([CIRCUIT_NUMBER]) = 1
INSERT INTO [Destination_Table_Name]([Field_Name])
SELECT [Field_Name]
FROM [dbo].[Source_Table_Name] WHERE ISNUMERIC([CIRCUIT_NUMBER]) <> 1
【讨论】:
感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地了解正在发生的事情,尤其是那些刚接触该语言并难以理解概念的社区成员。 另外,作为其中的一部分,可能值得指出为什么其他答案不起作用。它们是否有特别的问题,例如语法或逻辑错误?这对于与投票最多的答案进行对比特别有用。【参考方案15】:select format(convert(float,@your_column),'0.0#########')
优点:此方案独立于源数据类型(float、scientific、varchar、date、等等)
String
限制为 10 位,bigInt
去掉了十进制值。
【讨论】:
【参考方案16】:这行得通:
假设
dbo.AsDesignedBites.XN1E1 = 4016519.564`
对于以下字符串:
'POLYGON(('+STR(dbo.AsDesignedBites.XN1E1, 11, 3)+'...
【讨论】:
以上是关于在没有科学计数法的 SQL Server 中将 float 转换为 varchar的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 - 从 Float 将列更改为 Varchar 产生科学记数法
Python中将array类型不按科学计数法存在文件中的方法
SQL Server中如何把 科学记数法字符串 变为 数字字符串