SQL सर्वर में फ़्लोट को varchar में कैसे बदलें


130

मेरे पास अलग-अलग लंबाई की संख्या के साथ एक फ्लोट कॉलम है और मैं उन्हें varchar में बदलने की कोशिश कर रहा हूं।

कुछ मान बिगिनट अधिकतम आकार से अधिक हैं, इसलिए मैं ऐसा कुछ नहीं कर सकता

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))अन्यथा मुझे सवाल नहीं है
डेनिस वलेव

5
आपके कलाकारों के लिए मूल्य 2.2e + 026 है। संभवत: आपको
क्वैशन

जवाबों:


246

STR()फ़ंक्शन का उपयोग करके देखें ।

SELECT STR(float_field, 25, 5)

एसटीआर () फ़ंक्शन


एक और नोट: यह पैड रिक्त स्थान के साथ बाईं ओर है। यह एक समस्या है, तो साथ गठबंधन LTRIM:

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

3
मुझे मिला ************************* । वह क्या है? :)
hgulyan

4
@hgulyan - क्या Select LTRIM(Str(float_field, 38, 0))आपके डेटा के लिए काम करता है ?
मार्टिन स्मिथ

@ मर्टिन स्मिथ, यह काम करने लगता है, लेकिन दशमलव के समान है, इसलिए मुझे यकीन नहीं है कि यह वास्तविक मूल्य है (अंतिम दस अंक शून्य हैं)। मुझे लगता है, कि वास्तविक मूल्य खो गया था। धन्यवाद!
hgulyan

2
@hgulyan- अंतिम दस अंक शून्य हैं क्योंकि यही अंतिम Strफ़ंक्शन के लिए है। दशमलव बिंदु के बाद अंकों की संख्या। क्या आपने मेरे द्वारा पोस्ट की गई लिंक को पढ़ा है? शून्य को 10. में बदलें Select LTRIM(Str(float_field, 38, 10))
कोडिंगबर्गर

4
काश, SSMS में चेतावनी होती कि "अरे, जब आप उस गलत फ्लोट टेलीफोन क्षेत्र को पाठ में परिवर्तित करते हैं, तो वैज्ञानिक संकेतन के साथ एक अच्छा टेलीफोन नंबर प्राप्त करने के लिए तैयार रहें! हम पहले ltrim (str) के लिए पर्याप्त स्मार्ट नहीं हैं ..."
pkExec

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 सर्वर संस्करणों (Azure SQL डेटाबेस और SQL Server 2016 RC3 में शुरू) में उपयोग किया जाना चाहिए


2
@Adinas के लिए, फ्लोट मान को इसे रूपांतरित किया जाता है, लेकिन 0फ्लोट मान के अपवाद के रूप में परिवर्तित किया जाता है 0.0E0। मुझे फ्लोट क्षेत्र को रूपांतरित करने की आवश्यकता थी varcharक्योंकि मुझे यह दिखाने की आवश्यकता है कि यह NAकब NULLऔर 0जैसा है। मैंने 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
फूजीएफएक्स

2
Microsoft पर दस्तावेज़ के अनुसार - msdn.microsoft.com/en-us/library/ms187928.aspx , 128 सिंटैक्स को विरासत के कारणों में शामिल किया गया है और इसे भविष्य के संस्करण में चित्रित किया जा सकता है
माइक टर्नर

1
128 को हटा दिया गया है लेकिन 3 सबसे हाल ही में SQL सर्वर रिलीज़ में इसके लिए प्रतिस्थापन लगता है।
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

उपयोगी विषय धन्यवाद।

यदि आप चाहते हैं कि मेरे लिए अग्रणी शून्य हटा दें तो आप इसका उपयोग कर सकते हैं:

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

2

फ्लोट में केवल एक अधिकतम है। 15 अंकों की शुद्धता। 15 वीं स्थिति के बाद के अंक इसलिए यादृच्छिक हैं, और बिगिंट (अधिकतम 19 अंक) या दशमलव में रूपांतरण आपकी मदद नहीं करता है।


मुझे नहीं मिला। फील्ड वैल्यू 2.2000012095022E + 26 है। इसका क्या उपाय है? कोई नहीं है?
hgulyan

मूल मूल्य में संग्रहीत अंकों की तुलना में आप स्ट्रिंग में परिवर्तित करके अधिक अंक प्राप्त नहीं कर सकते।
देवियो

तो मैं 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))

यह दशमलव के बाद के अंकों को हटा देगा, यदि कोई हो। इसलिए, यह समाधान सटीक नहीं है।
रसभूग

2

यह कोशिश करो, काम करना चाहिए:

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

1

यदि आप सीएलआर फ़ंक्शन का उपयोग करते हैं, तो आप फ्लोट को एक स्ट्रिंग में बदल सकते हैं जो फ्लोट की तरह दिखता है, बिना सभी अतिरिक्त 0 के अंत में।

सीएलआर समारोह

[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 दशमलव स्थानों पर काट दिए गए हैं, और कोई अनुगामी शून्य नहीं हैं। परिशुद्धता के 18 अंक हमारे लिए कोई समस्या नहीं है। और, हमारे FP संख्याओं (100,000 मानों के करीब) का 100% स्ट्रिंग मानों के समान है जैसा कि वे डेटाबेस में FP संख्याओं के रूप में करते हैं।


0

संशोधित एक्सल की प्रतिक्रिया के रूप में यह कुछ मामलों के लिए अवांछनीय परिणाम पैदा करेगा।

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]
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 एक संख्या प्रस्तुत करता है जो सही प्रतीत होता है। मैं इसका अर्थ यह नहीं लगा सकता कि यह आगे के मुद्दों को कम करता है या एक जटिल गणितीय कार्य के भीतर उपयोगी है।

टी एसक्यूएल कोड की आपूर्ति करती थी चाहिए , जबकि दूसरों को सक्षम करने के लिए अपने कोड का परीक्षण करने और विचारों उठता आवश्यकता चाहिए स्पष्ट रूप से मेरे टिप्पणियों का प्रदर्शन।

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मूल्य के अंत में कोई अंक न जोड़ें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.