ProgramingTip

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

bestdevel 2020. 12. 28. 21:54
반응형

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


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

예 :

나는 float 값 1000.2324422를 가지고 동일한 1000.2324422 와 같이 varchar로 변환 됩니다.

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


항상 '1.67383e + 008'이 나오는 167,382,981과 같은 큰 정수 (부동 필드에서) 사용하여를 캐스팅하거나 CHAPTER 2 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))


이것은 소수 때문에 특별한 경우와 관련이 없지만 제목을 구글링하는 사람들에게 도움이 될 수 있습니다. 정수 필드는 미세을 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, '')

위의 예에서 format 함수가 유용하다는 것을 알 수 있습니다. FORMAT () 함수는 항상 nvarchar를 반환합니다.


STR () 함수로 인해 공백이 생기기 때문에 또 다른 솔루션이 있으므로 FORMAT () 함수를 다음 예제로 사용합니다.

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

위 코드의 결과는 다음과 같습니다.

:      1000 :1000.2324422   :1000

이것은 작동합니다 :

가정

dbo.AsDesignedBites.XN1E1 = 4016519.564`

다음 문자열의 경우 :

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

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

반응형