2012-04-26 6 views
0

J'ai une boucle qui ajoute les résultats de ma base de données. Les valeurs sont des chaînes numériques dans ce format: $$$, $$$ $$ Je ne parviens pas à obtenir les résultats d'ajouter et d'afficher dans ce même format.Ajouter des chaînes numériques avec des virgules

function totals(){ 
    $result = mysql_query("SELECT meta_value FROM postmeta WHERE postmeta.meta_key = 'Value'"); 
    $value = 0; 
    while($row = mysql_fetch_array($result)) { 
     $value = $value + str_replace(',', '', $row['meta_value']); 
    } 
    echo "Worth $".$value."!"; 
}; 

En utilisant ce qui précède, je reçois quelque chose comme Worth 653987.32 $. Maintenant, j'ai besoin de réinsérer les virgules donc j'essaie ceci:

$value = number_format($value, 2, '.', ','); 

Mais alors je reçois une valeur de 10.000,00 $!

sortie comme demandé:

original: 5,000.00 numeric: 5 
    original: 0.00 numeric: 0 
    original: 100.00 numeric: 100 
    original: 19.95 numeric: 20 
    original: 28.00 numeric: 28 
    original: 3,777.00 numeric: 3 
    original: 2,500.00 numeric: 2 
    original: 575.00 numeric: 575 
    original: 4,000.00 numeric: 4 
    original: 100.00 numeric: 100 
    original: 1,500.00 numeric: 1 
    original: 0.00 numeric: 0 
    original: 343.50 numeric: 344 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 1,070.00 numeric: 1 
    original: 305.00 numeric: 305 
    original: 1,000.00 numeric: 1 
    original: 0.00 numeric: 0 
    original: 50.00 numeric: 50 
    original: 1144.99 numeric: 1,145 
    original: 900.00 numeric: 900 
    original: 3,750.00 numeric: 3 
    original: 1,750 numeric: 1 
    original: 50.00 numeric: 50 
    original: 50.00 numeric: 50 
    original: 50.00 numeric: 50 
    original: 200.00 numeric: 200 
    original: 619.00 numeric: 619 
    original: 200.00 numeric: 200 
    original: 50.00 numeric: 50 
    original: 0.00 numeric: 0 
    original: 2,699.00 numeric: 2 
    original: 0.00 numeric: 0 
    original: 10,000.00 numeric: 10 
    original: 500.00 numeric: 500 
    original: 186.00 numeric: 186 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 39,000.00 numeric: 39 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 8,330.00 numeric: 8 
    original: 0.00 numeric: 0 
    original: 50.00 numeric: 50 
    original: 50.00 numeric: 50 
    original: 100.00 numeric: 100 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 4,875.00 numeric: 4 
    original: 1,000.00 numeric: 1 
    original: 3,135.00 numeric: 3 
    original: 15,000.00 numeric: 15 
    original: 400.00 numeric: 400 
    original: 75.00 numeric: 75 
    original: 100.00 numeric: 100 
    original: 6,893.00 numeric: 6 
    original: 330.00 numeric: 330 
    original: 484.96 numeric: 485 
    original: 8,600.00 numeric: 8 
    original: 2,500.00 numeric: 2 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 6,150.00 numeric: 6 
    original: 500.00 numeric: 500 
    original: 275.00 numeric: 275 
    original: 900.00 numeric: 900 
    original: 750.00 numeric: 750 
    original: 450.00 numeric: 450 
    original: 4,600.00 numeric: 4 
    original: 299.50 numeric: 300 
    original: 250.00 numeric: 250 
    original: 825.00 numeric: 825 
    original: 750.00 numeric: 750 
    original: 50.00 numeric: 50 
    original: 2,000.00 numeric: 2 
    original: 16,000 numeric: 16 
    original: 2,600.00 numeric: 2 
    original: 240.00 numeric: 240 
    original: 4,500.00 numeric: 4 
    original: 0.00 numeric: 0 
    original: 6,000.00 numeric: 6 
    original: 0.00 numeric: 0 
    original: 3,000.00 numeric: 3 
    original: 0.00 numeric: 0 
    original: 15,000.00 numeric: 15 
    original: 45,987.24 numeric: 45 
    original: 1,100.00 numeric: 1 
    original: 20,000.00 numeric: 20 
    original: 5,100.00 numeric: 5 
    original: 12,000.00 numeric: 12 
    original: 0.00 numeric: 0 
    original: 550.00 numeric: 550 
    original: 50.00 numeric: 50 
    original: 50.00 numeric: 50 
    original: 150.00 numeric: 150 
    original: 4,500.00 numeric: 4 
    original: 1,500.00 numeric: 1 
    original: 0.00 numeric: 0 
    original: 1,758.00 numeric: 1 
    original: 450.00 numeric: 450 
    original: 400.00 numeric: 400 
    original: 28.00 numeric: 28 
    original: 20.00 numeric: 20 
    original: 50.00 numeric: 50 
    original: 20.00 numeric: 20 
    original: 22.00 numeric: 22 
    original: 99.00 numeric: 99 
    original: 500.00 numeric: 500 
    original: 500.00 numeric: 500 
    original: 33,080.00 numeric: 33 
    original: 3,000.00 numeric: 3 
    original: 5,000.00 numeric: 5 
    original: 25,000.00 numeric: 25 
    original: 25,750.00 numeric: 25 
    original: 5,000.00 numeric: 5 
    original: 1,800.00 numeric: 1 
    original: 419.75 numeric: 420 
    original: 600.00 numeric: 600 
    original: 130.00 numeric: 130 
    original: 1,000.00 numeric: 1 
    original: 650.00 numeric: 650 
    original: 650.00 numeric: 650 
    original: 285.00 numeric: 285 
    original: 949.00 numeric: 949 
    original: 500.00 numeric: 500 
    original: 798.80 numeric: 799 
    original: 279.50 numeric: 280 
    original: 369.90 numeric: 370 
    original: 0.00 numeric: 0 
    original: 5,000.00 numeric: 5 
    original: 1,995.00 numeric: 1 
    original: 1,800.00 numeric: 1 
    original: 0.00 numeric: 0 
    original: 50.00 numeric: 50 
    original: 50.00 numeric: 50 
    original: 50.00 numeric: 50 
    original: 3,316.00 numeric: 3 
    original: 50.00 numeric: 50 
    original: 50.00 numeric: 50 
    original: 0.00 numeric: 0 
    original: 50.00 numeric: 50 
    original: 17,182.28 numeric: 17 
    original: 30,000.00 numeric: 30 
    original: 0.00 numeric: 0 
    original: 0.00 numeric: 0 
    original: 880.00 numeric: 880 
    original: 12.00 numeric: 12 
    original: 100.00 numeric: 100 
    original: 100.00 numeric: 100 
    original: 100.00 numeric: 100 
    original: 5,600.00 numeric: 5 
    original: 1,600.00 numeric: 1 
    original: 100.00 numeric: 100 
    original: 14.95 numeric: 15 
    original: 6,000.00 numeric: 6 
    original: 7,400.00 numeric: 7 
    original: 750.00 numeric: 750 
    original: 1,575.00 numeric: 1 
    original: 50.00 numeric: 50 
    original: 3,500.00 numeric: 3 
    original: 5,000.00 numeric: 5 
    original: 1,000.00 numeric: 1 
    original: 6,500.00 numeric: 6 
    original: 14,375.00 numeric: 14 
    original: 9,500.00 numeric: 9 
    original: 91,343.00 numeric: 91 
    original: 22,610.00 numeric: 22 
    original: 15,000.00 numeric: 15 
    original: 10,000.00 numeric: 10 

Il est clair que quelque chose ne va pas. Quelqu'un peut-il aider?

numeric total: 661,379 Original total: 661379.32 
+0

On dirait que vous stockez un numérique dans un champ VARCHAR dans votre base de données. Vous devriez vraiment changer le champ en numérique et utiliser les fonctions d'agrégat du db pour faire vos calculs pour vous. Je ne peux pas voir la logique de stocker un nombre comme une chaîne. –

+0

Je ne peux pas. les nombres sont insérés par wordpress - tout est chaîne. – Sweepster

Répondre

2

Que produit-il? Il semble que votre numéro soit trop grand pour tenir dans 31bits, mais il est difficile de savoir jusqu'à ce que je vois votre sortie exacte.

Etes-vous sûr que toutes vos valeurs $row['meta_value'] sont des nombres simples avec des virgules? Essayez de le faire:

while($row = mysql_fetch_array($result)) { 
    echo "Value: {$row['meta_value']}\n"; 
    $value += str_replace(',', '', $row['meta_value']); 
} 

echo "final value: $value\n"; 
echo "formatted: ".number_format($value, 2)."\n"; 

Je me demande si certaines valeurs ne sont pas conformes à vos attentes.

+0

pouvez-vous ajouter les deux premières lignes à la fin de votre script - quelle est la valeur $ avant d'essayer et de le formater? – Cal

+0

oh! vous * mettez * la ligne 'number_format()' après * la boucle, non? – Cal

+0

la sortie est enregistrée. – Sweepster

0

Vous pouvez encore jeter la valeur en un nombre flottant:

(float)str_replace(',','',$row['meta_value']) 

EDIT:

code complet:

function totals() { 
    $result = mysql_query("SELECT meta_value FROM postmeta WHERE postmeta.meta_key = 'Value'"); 
    $value = 0; 
    while ($row = mysql_fetch_array($result)) { 
     $value += (float)str_replace(',', '', $row['meta_value']); 
    } 
    echo "Worth \$$value!"; 
}; 
0

Vous pouvez également les obtenir correctement mis en forme de la requête lui-même et opérer sur le terrain que vous voulez:

SELECT replace(meta_value, ',', '') as number_value, meta_value as original_value 
FROM postmeta 
WHERE postmeta.meta_key = 'Value' 
Questions connexes