programing tip

과학적 표기법없이 SQL 서버에서 float를 varchar로 변환

itbloger 2020. 12. 27. 10:25
반응형

과학적 표기법없이 SQL 서버에서 float를 varchar로 변환


과학적 표기법 및 소수 자릿수없이 SQL 서버에서 float를 varchar로 변환합니다.

예 :

나는 float 값이 1000.2324422 이면 동일한 1000.2324422 와 같이 varchar로 변환됩니다 .

임의의 수의 십진수 값이있을 것입니다. 부동 값은 무작위로 나옵니다.


항상 '1.67383e + 008'이 나오는 167382981과 같은 큰 정수 (float 필드에서)를 사용하여 캐스팅하거나 변환 VARCHAR(MAX)하거나 다른 것으로 작동 하지 않았습니다 .

어떤 작업은했다 STR().


나에게도 str()또는 cast(float as nvarchar(18))하지 않았습니다 .

결국 작동하는 것은 int로 변환 한 다음 다음과 같이 nvarchar로 변환하는 것입니다.

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

STR 기능이 잘 작동합니다. 몇 가지 계산을 한 후 float가 돌아 왔고 VARCHAR로 변경해야했지만 과학적 표기법 randonly도 얻었습니다. 나는 모든 계산 후에이 변형을 만들었다

 ltrim(rtrim(str(someField)))

시험 CAST(CAST(@value AS bigint) AS varchar)


이것은 작동합니다 CONVERT(VARCHAR(100), CONVERT(DECIMAL(30, 15), fieldname))


이것은 소수 때문에이 특별한 경우와 관련이 없지만 제목을 구글링하는 사람들에게 도움이 될 수 있습니다. 정수 필드는 fine을 varchar로 변환하지만 float는 과학적 표기법으로 변경됩니다. 소수가없는 경우 부동 소수점을 빠르게 변경하는 매우 빠른 방법은 먼저 필드를 정수로 변경 한 다음 varchar로 변경하는 것입니다.


이 시도:

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. VARCHAR로 캐스팅하면 REPLACE 함수를 사용할 수 있습니다.
  3. 먼저 0을 공백으로 교체 한 다음 RTRIM을 사용하여 모든 후행 공백 (이전에는 0)을 제거한 다음 나머지 공백을 0으로 교체합니다.
  4. 그런 다음 마침표에 대해 동일한 작업을 수행하여 소수 값이없는 숫자를 제거합니다.

데이터를 아주 잘 테스트해야합니다. 이것은 지저분해질 수 있습니다. 다음은 단순히 값에 10을 곱한 결과의 예입니다.이를 실행하여 어떤 일이 발생하는지 확인하십시오. 내 SQL Server 2017 상자에서 세 번째 쿼리에서 *********를 얻습니다. BIGINT로 CAST하면 매번 작동합니다. 그러나 충분한 데이터를 테스트하지 않고 테스트하지 않으면 나중에 문제가 발생할 수 있으므로 최대 예상 값을 테스트하지 않는 한 모든 데이터에서 작동 할 것이라고 생각하지 마십시오.

 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)

다음은 과학적 표기법없이 float 값을 변환 할 수있는 예입니다.

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

In the above example, we can see that the format function is useful for us. FORMAT() function returns always nvarchar.


I have another solution since the STR() function would result some blank spaces, so I use the FORMAT() function as folowing example:

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

The result of above code would be:

:      1000 :1000.2324422   :1000

This works:

Suppose

dbo.AsDesignedBites.XN1E1 = 4016519.564`

For the following string:

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

ReferenceURL : https://stackoverflow.com/questions/6521354/convert-float-into-varchar-in-sql-server-without-scientific-notation

반응형