97 votes

Supprimer les zéros de fin de décimale dans SQL Server

J'ai une colonne DECIMAL(9,6) c'est-à-dire qu'il supporte des valeurs comme 999,123456.

Mais lorsque j'insère des données comme 123,4567, cela devient 123,456700.

Comment supprimer ces zéros ?

0 votes

Veuillez remplacer la réponse correcte par la réponse de @Andomar.

0 votes

@dangalg : Je crois fermement que cela devrait être fait dans la couche de présentation en effet. C'est pourquoi je n'ai jamais changé la réponse acceptée. Cependant, après réflexion, je pense que je devrais accepter ce que la communauté a clairement indiqué comme étant la meilleure réponse.

166voto

Andomar Points 115404

A decimal(9,6) enregistre 6 chiffres à droite de la virgule. L'affichage ou non des zéros de fin est une décision de formatage, généralement mise en œuvre du côté client.

Mais comme SSMS formate float sans zéros de fin, vous pouvez supprimer les zéros de fin en coulant l'élément decimal à un float :

select 
    cast(123.4567 as DECIMAL(9,6))
,   cast(cast(123.4567 as DECIMAL(9,6)) as float)

des empreintes :

123.456700  123,4567

(Mon séparateur décimal est une virgule, pourtant SSMS formate les décimales avec un point. Apparemment, un problème connu .)

9 votes

+1 Je pensais que la conversion en flottant introduirait une certaine imprécision dans les résultats mais cela semble fonctionner parfaitement.

1 votes

L'inconvénient de cette méthode est que si vous commencez par "2.0", il se transforme en "2". C'est probablement correct pour la personne qui pose la question, mais j'avais besoin de pouvoir conserver un seul zéro après la décimale, sans conserver d'autres zéros de queue. La réponse de @user1959416 résout ce problème.

7 votes

De plus, les flottants sont en général un très mauvais choix pour stocker des nombres. Vous obtiendrez des erreurs d'arrondi car ce n'est pas un type exact. N'utilisez jamais float.

34voto

robert4 Points 173

Vous pouvez utiliser le FORMAT() (SqlAzure et Sql Server 2012+) :

SELECT FORMAT(CAST(15.12     AS DECIMAL(9,6)), 'g18')  -- '15.12'
SELECT FORMAT(CAST(0.0001575 AS DECIMAL(9,6)), 'g10')  -- '0.000158'
SELECT FORMAT(CAST(2.0       AS DECIMAL(9,6)), 'g15')  -- '2'

Soyez prudent lorsque vous utilisez FLOAT (ou REAL) : n'utilisez pas g17 ou plus (ou g8 ou plus grand avec REAL), car la précision limitée de la représentation de la machine provoque des effets indésirables :

SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17')         -- '15.119999999999999'
SELECT FORMAT(CAST(0.9 AS REAL), 'g8')             -- '0.89999998'
SELECT FORMAT(CAST(0.9 AS REAL), 'g7')             -- '0.9'

En outre, il convient de noter que, selon la documentation :

FORMAT s'appuie sur la présence du langage commun du cadre .NET. Runtime (CLR). Cette fonction ne sera pas délocalisée car elle dépend de la présence du de la présence du CLR. La délocalisation d'une fonction qui nécessite le CLR provoquerait une erreur sur le serveur distant.

Fonctionne aussi dans SqlAzure.

0 votes

Pour mon cas, j'ai trouvé qu'une chaîne de format de g8 formatait mon nombre comme "1e-08", ce qui n'était pas ce que je recherchais. Cette réponse m'a cependant conduit à une autre que je pourrais utiliser

12voto

Martin Smith Points 174101

Sauf si vous voulez le convertir en chaîne de caractères, vous ne pouvez pas. Vous devez le faire dans la couche de présentation.

8voto

user1959416 Points 49
SELECT REVERSE(ROUND(REVERSE(2.5500),1))

des empreintes :

2.55

2 votes

Cette méthode est intéressante en ce sens qu'elle laisse un zéro de queue s'il n'y a qu'un zéro. Ainsi, 2.5500 renvoie 2.55, et 2.000 renvoie 2.0 au lieu de 2. C'est idéal pour le formatage des tailles de moteur dans un véhicule...

4 votes

@MasonG.Zhwiti Je doute que cela fonctionne avec certaines décimales avec plus de chiffres après le point décimal comme 232.33220003200 par exemple :- )

0 votes

@gotqn Bon point, cela échoue définitivement. Cependant, pour notre cas d'utilisation spécifique (formatage des tailles de moteur dans les voitures), cela fonctionne parfaitement :)

1voto

Ishtiaq Points 21

Il est possible de supprimer les zéros de tête et de queue dans TSQL

  1. Convertissez-le en chaîne de caractères en utilisant la fonction STR TSQL if not string, Then

  2. Supprimez les zéros de tête et de queue

    SELECT REPLACE(RTRIM(LTRIM(REPLACE(AccNo,'0',' '))),' ','0') AccNo FROM @BankAccount
  3. Plus d'informations sur forum .

4 votes

C'est un peu laid, mais cette version élimine le "." restant : REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(X,'0',' ')),' ','0'),'.',' ')),' ','.')

1 votes

Attention, si le nombre n'est pas décimal, il coupera aussi les zéros. CHARINDEX('.',@Number) != 1 testera cela.

0 votes

Ma vérification décimale précédente est erronée. Voici une meilleure solution : Select Len(@Test) - Len(Replace(@Test, 'a', '')) Comme NumberOfCharacters Expliqué : tinyurl.com/o4fc8g7 y tinyurl.com/kgzkuqk

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