SQL Server에서 float를 varchar로 변환하는 방법


130

길이가 다른 부동 열이 있고 varchar로 변환하려고합니다.

일부 값은 bigint 최대 크기를 초과하므로 다음과 같이 할 수 없습니다

cast(cast(float_field as bigint) as varchar(100))

십진수를 사용하려고 시도했지만 숫자의 크기가 같지 않으므로 도움이되지 않습니다.

CONVERT(varchar(100), Cast(float_field as decimal(38, 0)))

도움을 주시면 감사하겠습니다.

최신 정보:

샘플 값은 2.2000012095022E + 26 입니다.


cast(float_field as varchar(max))그렇지 않으면 내가 질문하지 않는다
데니스 Valeev 보낸

5
캐스트의 가치는 2.2e + 026입니다. 아마 당신은 으론 :)하지 않습니다
hgulyan

답변:


246

STR()기능을 사용해보십시오 .

SELECT STR(float_field, 25, 5)

STR () 함수


또 다른 참고 사항 : 왼쪽에 공백이 있습니다. 이것이 문제라면 다음과 결합하십시오 LTRIM.

SELECT LTRIM(STR(float_field, 25, 5))

3
나는 *************************을 얻었다. 그게 뭐야? :)
hgulyan

4
@hgulyan- Select LTRIM(Str(float_field, 38, 0))데이터에 적합합니까?
Martin Smith

@Martin Smith, 작동하는 것 같지만 십진수와 같은 방식이므로 실제 값인지 확실하지 않습니다 (마지막 10 자리가 0 임). 나는 실제 가치가 없어 졌다고 생각합니다. 감사합니다!
hgulyan

2
@hgulyan-마지막 10 자리 숫자는 0입니다. 왜냐하면 그것이 Str함수 에서 마지막 매개 변수를위한 것이기 때문입니다 . 소수점 뒤의 자릿수입니다. 내가 게시 한 링크를 읽었습니까? 0을 10으로 변경합니다. Select LTRIM(Str(float_field, 38, 10))
codingbadger

4
나는 ...! "텍스트에 그 잘못된 플로트 전화 필드를 변환 할 때 헤이, 우리가 처음 (캐릭터를) LTRIM하지 스마트 충분히 과학적 표기법으로 좋은 전화 번호를 얻을 수 있도록 준비"경고가 SSMS에 있던 소원
pkExec 2018 년

42

정확한 원래 번호를 반환하는 유일한 쿼리 비트는 다음과 같습니다.

CONVERT (VARCHAR(50), float_field,128)

http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html을 참조 하십시오

위의 다른 솔루션은 때로는 끝에 숫자를 반올림하거나 추가합니다.

업데이트 : 아래 의견과 https://msdn.microsoft.com/en-us/library/ms187928.aspx 에서 볼 수있는 내용 :

CONVERT (VARCHAR(50), float_field,3)

새 SQL Server 버전에서 사용해야합니다 (Azure SQL Database 및 SQL Server 2016 RC3부터).


2
@adinas의 경우 +1, float 값은로 변환되지만 0float 값은로 변환됩니다 0.0E0. 나는에 플로트 필드를 변환 할 필요가 varchar내가 표시 할 필요로 NA할 때 NULL0그대로. CASE아래와 같이 쿼리에 명령문 을 추가하여이를 달성했습니다 . CASE WHEN float_field IS NULL THEN 'NA' WHEN float_field = 0 THEN '0' ELSE CONVERT(VARCHAR, float_field, 128) END AS float_As_VChar
fujiFX

2
마이크로 소프트의 문서에 따르면 - msdn.microsoft.com/en-us/library/ms187928.aspx , 128 구문은 기존의 이유로 포함되어 있으며, 미래의 버전 depreceated 할 수있다
마이크 터너

1
128은 더 이상 사용되지 않지만 가장 최근의 SQL Server 릴리스에서는 3이 대신 사용됩니다.
user3524983

13

이것은 sqlserver 2012에서 사용했던 솔루션입니다 (다른 모든 제안은 분수 부분 또는 다른 단점을 자르는 단점이 있기 때문에).

declare @float float = 1000000000.1234;
select format(@float, N'#.##############################');

산출:

1000000000.1234

이것은 수천 가지 구분 기호와 현지화를 쉽게 할 수있는 또 다른 이점이 있습니다 (제 경우).

select format(@float, N'#,##0.##########', 'de-DE');

산출:

1.000.000.000,1234

3

유용한 주제 감사합니다.

Leading zero를 제거하고 싶다면 다음을 사용할 수 있습니다.

DECLARE @MyFloat [float];
SET @MyFloat = 1000109360.050;
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(STR(@MyFloat, 38, 16), '0', ' '))), ' ', '0'),'.',' ')),' ',',')

2

float 에는 최대 값 만 있습니다. 15 자리의 정밀도. 따라서 15 번째 자리 이후의 숫자는 임의이므로 bigint (최대 19 자리) 또는 10 진수로 변환해도 도움이되지 않습니다.


나는 그것을 얻지 못한다. 필드 값은 2.2000012095022E + 26입니다. 해결책은 무엇입니까? 없어요?
hgulyan

원래 값에 저장된 숫자보다 문자열로 변환하여 더 많은 숫자를 얻을 수 없습니다.
devio

15 번째 자리에서 숫자를 잃어 버렸습니까?
hgulyan

데이터에 문제가있었습니다. 15 자리 부동 소수점으로 해당 값을 업데이트하면됩니다. 이 데이터와 관련된 주요 문제를 설명하므로 귀하의 답변을 수락하겠습니다. 감사합니다.
hgulyan

2

반올림하지 않고 도움이 될 수 있습니다

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)

2

integer첫 번째 로 변환 한 다음 다음으로 변환하십시오 string.

cast((convert(int,b.tax_id)) as varchar(20))

소수점 이하 자릿수가 있으면 제거합니다. 따라서이 솔루션은 정확하지 않습니다.
RushabhG

2

이것을 시도하십시오, 작동해야합니다 :

cast((convert(bigint,b.tax_id)) as varchar(20))

1

CLR 함수를 사용하는 경우 부동 소수점을 부동 소수점 모양의 문자열로 변환 할 수 있습니다.

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

.

경고

변환 된 모든 문자열은 소수점 이하 18 자리에서 잘리고 후행 0은 없습니다. 18 자리의 정밀도는 문제가되지 않습니다. 그리고 FP 번호의 100 % (100,000에 가까운 값)는 데이터베이스에서 FP 번호처럼 문자열 값과 동일하게 보입니다.


0

특정 경우에 대해 수정 된 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'),'.',' ')),' ','.')

0
select replace(myFloat, '', '')

에서 문서) (REPLACE :

입력 인수 중 하나가 nvarchar 데이터 형식 인 경우 nvarchar를 반환합니다. 그렇지 않으면 REPLACE는 varchar를 반환합니다.
인수 중 하나가 NULL이면 NULL을 리턴합니다.

테스트 :
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


0

선택
캐스트 (대체 (변환 (소수점 (15,2), acs_daily_debit), '.', ',') VARCHAR로 (20))

acs_balance_details에서


0

분자의 답을 바탕으로 :

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;

0

방금 비슷한 상황을 겪고 SSMS v17.9.1 / SQL 2017에 표시된 '매우 큰 숫자'의 반올림 문제에 놀랐습니다.

나는 해결책이 있다고 제안하지는 않지만 FORMAT 은 올바른 것으로 보이는 숫자를 나타 냅니다 . 나는 이것이 추가 반올림 문제를 줄이거 나 복잡한 수학 함수 내에서 유용하다는 것을 암시 할 수 없습니다.

T SQL 코드는 제공 해야 다른 사람을 활성화하면 자신의 코드를 테스트하고 아이디어가 발생할 필요합니다 동안 분명히 나의 관찰을 보여줍니다.

WITH Units AS 
(
   SELECT 1.0 AS [RaisedPower] , 'Ten' As UnitDescription
   UNION ALL
   SELECT 2.0 AS [RaisedPower] , 'Hundred' As UnitDescription
   UNION ALL
   SELECT 3.0 AS [RaisedPower] , 'Thousand' As UnitDescription
   UNION ALL
   SELECT 6.0 AS [RaisedPower] , 'Million' As UnitDescription
   UNION ALL
   SELECT 9.0 AS [RaisedPower] , 'Billion' As UnitDescription
   UNION ALL
   SELECT 12.0 AS [RaisedPower] , 'Trillion' As UnitDescription
   UNION ALL
   SELECT 15.0 AS [RaisedPower] , 'Quadrillion' As UnitDescription
   UNION ALL
   SELECT 18.0 AS [RaisedPower] , 'Quintillion' As UnitDescription
   UNION ALL
   SELECT 21.0 AS [RaisedPower] , 'Sextillion' As UnitDescription
   UNION ALL
   SELECT 24.0 AS [RaisedPower] , 'Septillion' As UnitDescription
   UNION ALL
   SELECT 27.0 AS [RaisedPower] , 'Octillion' As UnitDescription
   UNION ALL
   SELECT 30.0 AS [RaisedPower] , 'Nonillion' As UnitDescription
   UNION ALL
   SELECT 33.0  AS [RaisedPower] , 'Decillion' As UnitDescription

)

SELECT UnitDescription

   ,              POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )                                                             AS ReturnsFloat
   ,        CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) )                                        AS RoundingIssues
   , STR(   CAST( POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  AS NUMERIC (38,0) ) ,   CAST([RaisedPower] AS INT) + 2, 0) AS LessRoundingIssues
   , FORMAT(      POWER( CAST(10.0 AS FLOAT(53)) , [RaisedPower] )  , '0')                                                     AS NicelyFormatted

FROM Units
ORDER BY [RaisedPower]

0
SELECT LTRIM(STR(float_field, 25, 0))

가장 좋은 방법이므로 .0000값 끝에 숫자와 숫자를 추가하지 마십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.