Avatar billede farhang Nybegynder
26. september 2006 - 15:09 Der er 15 kommentarer og
1 løsning

Number_format driller!

Jeg har en php-kode, som viser et talsum. Men, når tallet overstiger 1000, så flytter koden tallet 3 decimaler. Er der en, som kan give mig et tip?

Link: http://www.designunltd.dk/la-femme/cart.php

<?php
$total = 0;
while ($row = mysql_fetch_array($results)) {
  echo "<tr>";
  extract($row);
  $prod = "SELECT * FROM products " .
          "WHERE products_prodnum='$carttemp_prodnum'";
  $prod2 = mysql_query($prod);
  $prod3 = mysql_fetch_array($prod2);
  extract($prod3);
  echo "<td><font class=\"undermenu1_5\">
          <form method=\"POST\" action=\"modcart.php?action=change\">
            <input type=\"hidden\" name=\"modified_hidden\"
              value=\"$carttemp_hidden\">
            <input type=\"text\" name=\"modified_quan\" size=\"2\"
              value=\"$carttemp_quan\">";
  echo "</font></td>";
  echo "<td><font class=\"undermenu1_5\">";
  echo "<a href=\"varerbeskrivelse.php?prodid=" . $products_prodnum . "\">";
  echo "<img src=" . $products_thumbnailimageurl . "  width=\"25\" height=\"25\" border=\"0\"></a></font></td>";
  echo "<td>";
  echo "<a href=\"varerbeskrivelse.php?prodid=" . $products_prodnum . "\" class=\"undermenu1_5\">";
  echo $products_navn;
  echo "</font></a></td>";
  echo "<td align=\"right\"><font class=\"undermenu1_5\">";
  echo number_format($products_pris, 2 , ',' , '.');
  echo "</font></td>";
  echo "<td align=\"right\"><font class=\"undermenu1_5\">";
  //get extended price
  $extprice = number_format($products_pris * $carttemp_quan, 2 , ',' , '.');
  echo $extprice;
  echo "</font></td>";
  echo "<td>";
  echo "<input type=\"submit\" name=\"Submit\"
          value=\"change\">
        </form></td>";
  echo "<td>";
  echo "<form method=\"POST\" action=\"modcart.php?action=delete\">
        <input type=\"hidden\" name=\"modified_hidden\"
          value=\"$carttemp_hidden\">";
  echo "<input type=\"submit\" name=\"Submit\"
          value=\"Slet smykke\">
        </form></td>";
  echo "</tr>";
  //add extended price to total
  $total = $extprice + $total;

}
?>
              <tr>
                <td colspan=\"4\" align=\"right\">Pris i alt(uden fragt):</td>
                <td colspan="2" align=\"right\"><?php echo number_format($total, 2 , ',' , '.'); ?></td>
                <td colspan="2">
Avatar billede erikjacobsen Ekspert
26. september 2006 - 16:44 #1
Du må ikke bruge det formatterede beløb som du får fra
$extprice = number_format($products_pris * $carttemp_quan, 2 , ',' , '.');
til udregninger i fx
  $total = $extprice + $total;

Det der kommer ud af number_format må alene bliver brugt til en print eller echo.
Avatar billede farhang Nybegynder
26. september 2006 - 19:16 #2
Hvad gør man så?
Avatar billede erikjacobsen Ekspert
26. september 2006 - 19:35 #3
I det jeg trak ud af din kode, så giver du $products_pris * $carttemp_quan et navn, og bruger det til den videre beregning. Og du bruger kun number_format til udskrift.
Avatar billede farhang Nybegynder
27. september 2006 - 00:43 #4
Jeg forstår ikke hvad du mener! Problemet er at f.eks. 180+180+180 giver tallet 540,00, som er korrekt, men 180+180+1800 giver tallet 361,80, hvilket er forkert. Såvidt jeg kan se bliver tallet 1800 rykket 3 decimaller til højre inden det bliver lagt sammen med 180+180. Jeg kan bare ikke finde logikken i det!

Kan du give mig en forklaring?
Avatar billede erikjacobsen Ekspert
27. september 2006 - 07:36 #5
Men forklaringen er givet. PHP regner rigtigt, sålænge du ikke regner på noget, der har været igennem number_format. Du skal alene bruge number_format til det du skal vise på siden, og ikke til noget, der skal regnes på.
Avatar billede farhang Nybegynder
27. september 2006 - 11:40 #6
Jeg vil jo vise det samlet pris for den enkelte vare og pris i alt. Hvad foreslår du?
Avatar billede erikjacobsen Ekspert
27. september 2006 - 11:59 #7
Jeg føler at jeg gentager mig selv, men alligevel: du skal kun bruge number_format i forbindelse med en udskrift. Og hvis du har gjort det, og det så stadig ikke virker, så må du vise os hvad du har gjort.
Avatar billede farhang Nybegynder
27. september 2006 - 12:21 #8
Min kode ser sådan ud:

<?php
if (!session_id()) {
  session_start();
}//connect to the database
$connect = mysql_connect("xxxxx", "xxxxx", "xxxxx")
  or die ("Hey loser, check your server connection.");
mysql_select_db("xxxxx_shop");
?>
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" href="library/fonts.xml" type="text/css">
</head>
<body bgcolor="#FFFFFF">
<table width="785" border="0" cellspacing="0" cellpadding="0" align="center">
  <tr>
    <td width="785" height="60" colspan="3"><img src="top.gif" width="785" height="60"></td>
  </tr>
  <tr>
    <td width="785" height="1" colspan="3" bgcolor="#A99964"></td>
  </tr>
  <tr>
    <td width="785" height="23" colspan="3"></td>
  </tr>
    <td width="385" height="472" valign="top" align="right"><img src="brud3_510x510p.jpg" width="385" height="472"></td>
    <td width="15" height="472"></td>
    <td width="385" height="472" class="indhold" valign="top" align="right">
      <table width="385" height="472" border="0" valign="top" align="left" cellspacing="0" cellpadding="0">
      <tr valign="middle" align="center">
        <td height="420" align="left" valign="top"><div align="center"><font class="undermenu1_5"><br>Du har<b>
          <?php
$sessid = session_id();

//display number of products in cart
$query = "SELECT * FROM carttemp WHERE carttemp_sess  = '$sessid'";
$results = mysql_query($query);

$rows = mysql_num_rows($results);
echo $rows;
?>
          </b>produkt(er) i din indkøbspose.<br>
        </font>
            <table  width="385" border="0" align="center" cellpadding="5">
              <tr>
                <td width="65"><font class="undermenu1_5"><b>antal</b></font></td>
                <td width="35"><font class="undermenu1_5"><b>vare</b></font></td>
                <td width="70"><font class="undermenu1_5"><b>navn</b></font></td>
                <td width="70"><font class="undermenu1_5"><b>stk. pris</b></font></td>
                <td width="70"><font class="undermenu1_5"><b>pris i alt</b></font></td>
                <?php
$total = 0;
while ($row = mysql_fetch_array($results)) {
  echo "<tr>";
  extract($row);
  $prod = "SELECT * FROM products " .
          "WHERE products_prodnum='$carttemp_prodnum'";
  $prod2 = mysql_query($prod);
  $prod3 = mysql_fetch_array($prod2);
  extract($prod3);
  echo "<td width=\"65\"><font class=\"undermenu1_5\">
          <form method=\"POST\" action=\"modcart.php?action=change\">
            <input type=\"hidden\" name=\"modified_hidden\"
              value=\"$carttemp_hidden\">
            <input type=\"text\" name=\"modified_quan\" size=\"1\"
              value=\"$carttemp_quan\">";
  echo "</font></td>";
  echo "<td width=\"35\" valign=\"middle\"><font class=\"undermenu1_5\">";
  echo "<a href=\"varerbeskrivelse.php?prodid=" . $products_prodnum . "\">";
  echo "<img src=" . $products_thumbnailimageurl . "  width=\"25\" height=\"25\" border=\"0\"></a></font></td>";
  echo "<td width=\"70\" valign=\"middle\">";
  echo "<a href=\"varerbeskrivelse.php?prodid=" . $products_prodnum . "\" class=\"undermenu1_5\">";
  echo $products_navn;
  echo "</font></a></td>";
  echo "<td width=\"70\" valign=\"middle\" align=\"right\"><font class=\"undermenu1_5\">";
  echo number_format($products_pris, 2 , ',' , '.');
  echo "</font></td>";
  echo "<td width=\"70\" valign=\"middle\" align=\"left\"><font class=\"undermenu1_5\">";
  //get extended price
  $extprice = number_format($products_pris * $carttemp_quan, 2 , ',' , '.');
  echo $extprice;
  echo "</font></td>";
  echo "<td width=\"40\" align=\"right\">";
  echo "<input type=\"submit\" name=\"Submit\"
          value=\"ændre\">
        </form></td>";
  echo "<td width=\"35\" align=\"right\">";
  echo "<form method=\"POST\" action=\"modcart.php?action=delete\">
        <input type=\"hidden\" name=\"modified_hidden\"
          value=\"$carttemp_hidden\">";
  echo "<input type=\"submit\" name=\"Submit\"
          value=\"slet\">
        </form></td>";
  echo "</tr>";
  //add extended price to total
  $total = $extprice + $total;

}

echo "<tr>";
echo "<td width=\"240\" colspan=\"4\" align=\"right\" class=\"undermenu1_5\"><b>Pris i alt(uden fragt):</b></td>";
?>
<?php echo "<td width=\"70\" colspan=\"2\" align=\"right\" class=\"undermenu1_5\"><b>"; ?><?php echo number_format($total, 2 , ',' , '.'); ?>

<?php
echo "</b></td>";
echo "<td width=\"75\" colspan=\"2\">";
echo "</td>"; 
echo "</tr>";   
?>               
  </table>

<?php
echo "<table width=\"385\" border=\"0\">";
echo "<tr>";
echo "<td width=\"130\" align=\"right\"><form method=\"POST\" action=\"checkout.php\">";
echo "<input type=\"submit\" name=\"Submit\" value=\"køb\">";
echo "</form></td>";
echo "<td width=\"255\" align=\"left\">";
echo "<form method=\"POST\" action=\"modcart.php?action=empty\">";
echo "<input type=\"hidden\" name=\"carttemp_hidden\" value=\"";
if (isset($carttemp_hidden)) {
  echo $carttemp_hidden;
}
echo "\">";
echo "<input type=\"submit\" name=\"Submit\" value=\"tøm indkøbspose\">
      </form>";
echo "</td>";
echo "</tr>";
echo "</table>"; 
?> 
<a href="kollektion.php" class="undermenu1_5right">Tilbage til kollektion</a></font></div></td>
  </tr>
</table>    </td>
  </tr>
  <tr>
    <td width="785" height="23" colspan="3"><img src="bund.gif" width="785" height="23"></td>
  </tr>
  <tr>
    <td width="785" height="1" colspan="3" bgcolor="#A99964"></td>
  </tr>
  <tr>
    <td width="785" height="20" colspan="3" align="center" class="indhold"><div align="center">copyright &copy; 2006 la-femme all rights
      reserved - powered by <font class="undermenu"><a href="http://www.designunltd.dk" class="undermenu">designunltd.dk</a></font></div></td>
  </tr>
</table>
</body>
</html>
Avatar billede erikjacobsen Ekspert
27. september 2006 - 12:47 #9
Og her er jo det samme problem som før. Der er ingen grund til at vise den samme kode 2 gange - jeg troede du havde forsøgt at lave noget om som jeg skrev før. Problemet er at i de to linier:

  $extprice = number_format($products_pris * $carttemp_quan, 2 , ',' , '.');
  echo $extprice;

får du skrevet en pris ud, pænt, som den skal. Men du bruge den formatterede pris senere i en beregning:

  $total = $extprice + $total;

Og det går galt. Du skal kun bruge number_format i forbindelse med en udskrift.
Avatar billede farhang Nybegynder
27. september 2006 - 12:59 #10
Kan man så ikke lave begge beregninger særskilt? For begge beregninger skal oplyses i min indkøbskurv.
Avatar billede erikjacobsen Ekspert
27. september 2006 - 13:06 #11
Jo, naturligvis. Det er derfor du kun skal bruge numeber_format i forbindelse med en udskrift. Ku' jeg ikke bede dig forklare mig, hvad det er du ikke forstår i den sætning?
Avatar billede farhang Nybegynder
27. september 2006 - 13:16 #12
Jeg forstår ikke, hvorfor jeg ikke kan udskrive beregningen korrekt, hvis jeg f.eks. køber over 1000 kr. af en bestemt varer eller hvis min køb overstiger 1000 kr.! Hvordan flytter man de 3 decimaler til højre. Jeg ved ikke, hvordan man skal formatterer tallene med 1000?
Avatar billede erikjacobsen Ekspert
27. september 2006 - 14:34 #13
Du kan sagtens udskrive beregningen korrekt: 1.000,00 som du vil have det. Det skal du bruge number_format til. Men du må ikke tage resulatet fra number_format og regne videre på det. Du skal kun bruge number_format til udskrift. Tager du "1.000,00" og regner videre på det, ser PHP, at der står "1.0" - de skøre amerikanere bruger "." i stedet for vores civiliserede decimalkomma.
Avatar billede farhang Nybegynder
27. september 2006 - 19:57 #14
Tusind tak for hjælpen. Så gik lyset op for mig, jeg omskrev koden og det virker perfekt.

<?php
               
$sessid = session_id();

$query = "SELECT * FROM carttemp WHERE carttemp_sess = '$sessid'";
$results = mysql_query($query)
  or die (mysql_query());
 
$total = 0;
while ($row = mysql_fetch_array($results)) {
  echo "<tr>";
  extract($row);
  $prod = "SELECT * FROM products " .
          "WHERE products_prodnum='$carttemp_prodnum'";
  $prod2 = mysql_query($prod);
  $prod3 = mysql_fetch_array($prod2);
  extract($prod3);
  echo "<td width=\"65\"><font class=\"undermenu1_5\">
          <form method=\"POST\" action=\"modcart.php?action=change\">
            <input type=\"hidden\" name=\"modified_hidden\"
              value=\"$carttemp_hidden\">
            <input type=\"text\" name=\"modified_quan\" size=\"1\"
              value=\"$carttemp_quan\">";
  echo "</font></td>";
  echo "<td width=\"35\" valign=\"middle\"><font class=\"undermenu1_5\">";
  echo "<a href=\"varerbeskrivelse.php?prodid=" . $products_prodnum . "\">";
  echo "<img src=" . $products_thumbnailimageurl . "  width=\"25\" height=\"25\" border=\"0\"></a></font></td>";
  echo "<td width=\"70\" valign=\"middle\">";
  echo "<a href=\"varerbeskrivelse.php?prodid=" . $products_prodnum . "\" class=\"undermenu1_5\">";
  echo $products_navn;
  echo "</font></a></td>";
  echo "<td width=\"70\" valign=\"middle\" align=\"right\"><font class=\"undermenu1_5\">";
  $products_pris = $products_pris;
  echo number_format($products_pris, 2 , ',' , '.');
  echo "</font></td>";
  echo "<td width=\"70\" valign=\"middle\" align=\"left\"><font class=\"undermenu1_5\">";
  //get extended price
  $extprice = $products_pris * $carttemp_quan;
  echo number_format($products_pris * $carttemp_quan, 2 , ',' , '.');
  echo "</td>";
  echo "<td class=\"undermenu1_5right\">";
  echo "<a href=\"cart.php\">ændring i indkøbspose</a>";
  echo "</font></td>";
  echo "</tr>";
  //add extended price to total
  $total = $extprice + $total;

}

echo "<tr>";
echo "<td width=\"240\" colspan=\"4\" align=\"right\" class=\"undermenu1_5\"><b>Pris i alt(uden fragt):</b></td>";
?>
<?php echo "<td width=\"70\" colspan=\"2\" align=\"right\" class=\"undermenu1_5\"><b>"; ?><?php echo number_format($total, 2 , ',' , '.'); ?>

Smid et svar. juhuuuuu ;-)
Avatar billede erikjacobsen Ekspert
27. september 2006 - 21:17 #15
Det lyder godt. Jeg samler slet ikke på point. Svar selv, accepter eget svar.
Avatar billede farhang Nybegynder
27. september 2006 - 21:38 #16
ok tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester