在没有科学记数法的情况下将float转换为SQL服务器中的varchar

时间:2011-06-29 13:24:09

标签: sql-server

在没有科学记数法和修剪小数的情况下,在SQL服务器中将float转换为varchar。

代表:

我有浮动值 1000.2324422 ,然后它会被转换为varchar,就像 1000.2324422 一样。

会有任意数量的十进制值。浮点值随机出现。

16 个答案:

答案 0 :(得分:77)

使用大整数(在浮点字段中)(例如167382981,总是出现'1.67383e + 008'),转换或转换为VARCHAR(MAX) 为我工作的任何其他内容。

所做的工作是STR()

答案 1 :(得分:37)

str()cast(float as nvarchar(18))都不适合我。

最终工作的是转换为int然后转换为nvarchar,如下所示:

 convert(nvarchar(18),convert(bigint,float))

答案 2 :(得分:27)

STR功能很好用。我做了一些计算后需要浮动回来,需要改为VARCHAR,但也得到了科学记法。我在所有计算之后进行了这种转换

 ltrim(rtrim(str(someField)))

答案 3 :(得分:6)

尝试CAST(CAST(@value AS bigint) AS varchar)

答案 4 :(得分:2)

由于小数的原因,这与此特定情况无关,但可以帮助那些谷歌标题的人。 整数字段可以很好地转换为varchars,但浮点数会更改为科学计数法。因此,如果没有小数,快速更改浮点数的快速方法是首先将字段更改为整数,然后将其更改为varchar。

答案 5 :(得分:2)

这有效CONVERT(VARCHAR(100), CONVERT(DECIMAL(30, 15), fieldname))

答案 6 :(得分:1)

试试这个:

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
  1. 以DECIMAL方式进行转换会在每个值上加上小数点,无论是否 之前有没有。
  2. Casting as VARCHAR允许您使用REPLACE函数
  3. 首先用空格替换零,然后用RTRIM去除所有尾随空格(以前为零),然后用零替换剩余空格。
  4. 然后对这段时间做同样的事情,以摆脱没有小数值的数字。

答案 7 :(得分:1)

您可以使用此代码:

STR(<Your Field>, Length, Scale)

您的字段 = 用于转换的浮动字段

长度 = 带小数点的浮点数的总长度

Scale = 小数点后的长度数

例如:

SELECT STR(1234.5678912,8,3)

结果是:1234.568

请注意,最后一位数字也是四舍五入。

祝你好运。

答案 8 :(得分:0)

您将必须非常好地测试数据。这会变得凌乱。这是一个简单的结果示例,只需将值乘以10。运行此命令以查看会发生什么。 在我的SQL Server 2017框中,在第三个查询中,我得到一堆*********。如果您将CAST设置为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)

答案 9 :(得分:0)

下面是一个示例,我们可以在不使用任何科学计数法的情况下转换浮点值。

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函数对我们很有用。 FORMAT()函数始终返回nvarchar。

答案 10 :(得分:0)

我有另一种解决方案,因为STR()函数会产生一些空格,因此我将FORMAT()函数用作以下示例:

id  date        value   flag
114 2016-01-01  0       1
114 2016-02-01  0       1
114 2016-03-01  200     1
114 2016-04-01  300     0
114 2016-05-01  100     0
220 2016-01-01  0       1
220 2016-02-01  0       1
220 2016-03-01  0       1
220 2016-04-01  0       1
220 2016-05-01  400     1
220 2016-06-01  200     0

以上代码的结果将是:

SELECT ':' + STR(1000.2324422), ':' + FORMAT(1000.2324422,'##.#######'), ':' + FORMAT(1000.2324422,'##')

答案 11 :(得分:0)

尝试此代码

SELECT CONVERT(varchar(max), CAST(1000.2324422 AS decimal(11,2)))

结果:1000.23

此处小数(11,2):11位数字计数(不带点),2-小数点后两位数字

答案 12 :(得分:0)

有很多答案,但是没有一个答案足够完整,无法适应将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等于1美元的小数点后2位是足够的,但是您可以轻松地增加它以满足您的需求。 此外,我们需要将“ .00”修剪为整数。

答案 13 :(得分:0)

以上都不对我有用。最后,我只是用了这个:

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

答案 14 :(得分:0)

select format(convert(float,@your_column),'0.0#########')

优点:此解决方案与源数据类型(浮点、科学、varchar、日期等)无关

String 限制为 10 位数字,bigInt 去掉十进制值

答案 15 :(得分:-1)

这有效:

假设

dbo.AsDesignedBites.XN1E1 = 4016519.564`

对于以下字符串:

'POLYGON(('+STR(dbo.AsDesignedBites.XN1E1, 11, 3)+'...