2009-09-06 7 views
0

Dans ma base de données, la plupart des valeurs numériques sont de type DECIMAL (10,6). Ce sont des colonnes de devises.Mise en forme automatique du nombre décimal en SQL ou PHP?

Maintenant, lorsque je récupère les numéros de MySQL, je reçois quelque chose comme ça

34,123456 // Je veux que ces
0,987654
500,000000 // Je ne veux pas que ces
1,000000

Est-il possible d'avoir les nombres apparaissent automatiquement comme entiers quand ils sont et de maintenir des décimales à ma précision désirée après le point, de sorte que je reçois par exemple

34,123456
0,987654

Répondre

2

Si tout ce que vous voulez est de modifier les chiffres affichés, alors vous pouvez utiliser printf avec le formatter %g et préciser le nombre maximum de chiffres de précision:

printf ("%.10g", 123.456); // outputs "123.456" 
printf ("%.10g", 123.456000000); // outputs "123.456" 
printf ("%.10g", 123.000000000); // outputs "123" 
printf ("%.10g", 1.234567891); // outputs "1.234567891" 
+0

+ 1 pour le coup de pouce subtil de se soucier du formatage sur la couche d'application, et pour utiliser une fonction qui fait * exactement * ce qui est nécessaire. – Eric

+0

... et vous devez utiliser la logique chaque fois que vous voulez afficher la valeur dans un format cohérent. +1 pour cauchemar de maintenance –

0

En PHP, vous pouvez faire une simple comparaison entier avant la sortie:

echo ((int) $var == $var) ? (int) $var : $var; 

Comme un exemple rapide/sale, ce code:

$var = '500.01'; 
echo ((int) $var == $var) ? (int) $var : $var; 
echo "\n"; 
$var = '500.00'; 
echo ((int) $var == $var) ? (int) $var : $var; 

Produit:

500.01 
500 
0

Vous pouvez CAST la valeur à tout type que vous souhaitez appliquer cette précision sur le côté SQL, par exemple:

SELECT 
    CASE myNumber MOD 1 
    WHEN 0 THEN CAST(myNumber AS decimal(10,0)) 
    ELSE myNumber 
    END 
FROM myTable; 
+0

je préfère cette solution à avoir à faire face avec le problème de maintenance, même si je peux voir la valeur de celui-là. Cependant, ma connaissance de mysql est vraiment basse, ainsi peut-il être fait pour toutes les tables juste une fois, comme un proc stocké ou ainsi? Ou dois-je même soumettre ce code dans ma déclaration SQL à l'intérieur du fichier PHP? Merci – faboolous

+0

De l'apparence des choses, vous ne pouvez pas le faire dans une fonction stockée car le type de retour est de deux précisions différentes (une fonction doit avoir seulement une précision spécifique qu'elle renvoie). Il n'y a rien qui vous empêche de mettre ceci dans un sProc, mais vous devrez appeler ce sProc chaque fois que vous voulez masser les données de cette façon. –

Questions connexes