152 votes

Comment convertir un float en varchar dans SQL Server

J'ai une colonne flottante avec des nombres de différentes longueurs et j'essaie de les convertir en varchar.

Certaines valeurs dépassent la taille maximale des bigint, je ne peux donc pas faire quelque chose comme ceci

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

J'ai essayé d'utiliser les décimales, mais les nombres ne sont pas de la même taille, donc cela ne m'aide pas non plus.

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

Toute aide est appréciée.

UPDATE :

La valeur de l'échantillon est 2.2000012095022E+26 .

0 votes

cast(float_field as varchar(max)) sinon je ne comprends pas la question

7 votes

Pour votre distribution est de 2.2e+026. Vous n'avez probablement pas compris la question :)

280voto

Barry Points 18913

Essayez d'utiliser le STR() fonction.

SELECT STR(float_field, 25, 5)

Fonction STR()


Une autre note : ce tampon à gauche avec des espaces. Si c'est un problème, combinez avec LTRIM :

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

3 votes

J'ai obtenu ************************* . Qu'est-ce que c'est ? :)

4 votes

@hgulyan - Does Select LTRIM(Str(float_field, 38, 0)) pour vos données ?

0 votes

@Martin Smith, Cela semble fonctionner, mais de la même manière qu'en décimal, donc je ne suis pas sûr que ce soit la valeur réelle (les dix derniers chiffres sont zéro). Je suppose que la valeur réelle a été perdue. Merci !

44voto

adinas Points 844

La seule requête que j'ai trouvée qui renvoie exactement le même numéro d'origine est la suivante

CONVERT (VARCHAR(50), float_field,128)

Voir http://www.connectsql.com/2011/04/normal-0-microsoftinternetexplorer4.html

Les autres solutions ci-dessus arrondissent ou ajoutent parfois des chiffres à la fin.

UPDATE : Selon les commentaires ci-dessous et ce que je peux voir en https://msdn.microsoft.com/en-us/library/ms187928.aspx :

CONVERT (VARCHAR(50), float_field,3)

Doit être utilisé dans les nouvelles versions de SQL Server (Azure SQL Database, et à partir de SQL Server 2016 RC3)

2 votes

+1 pour @adinas, la valeur flottante est convertie comme elle mais à l'exception de 0 valeur flottante convertie en 0.0E0 . J'avais besoin de convertir le champ flottant en varchar car j'ai besoin d'afficher NA quand NULL y 0 comme c'est le cas. J'y suis parvenu en ajoutant CASE dans la requête comme ci-dessous ; 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 votes

Selon le document sur Microsoft - msdn.microsoft.com/fr/us/library/ms187928.aspx la syntaxe 128 est incluse pour des raisons d'héritage et pourrait être supprimée dans une future version.

1 votes

128 est déprécié mais 3 semble être son remplacement dans les versions les plus récentes de SQL Server.

3voto

Axel Points 19

Sujet utile, merci.

Si vous voulez comme moi supprimer les plombages zéro vous pouvez utiliser cela :

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

2voto

devio Points 22981

float n'a qu'une précision maximale de 15 chiffres. Les chiffres après la 15e position sont donc aléatoires, et la conversion en bigint (19 chiffres maximum) ou en décimal ne vous aide pas.

0 votes

Je ne comprends pas. La valeur du champ est 2.2000012095022E+26. Quelle est la solution ? Il n'y en a pas ?

0 votes

Vous ne pouvez pas obtenir plus de chiffres en convertissant en chaîne qu'il n'y a de chiffres stockés dans la valeur originale.

0 votes

J'ai donc perdu des chiffres après la 15e position ?

2voto

Atul Points 11

Cela peut aider sans arrondir

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X