Kai: HILFE!!! Mein Mini e-shop zeigt zu wenig Dezimalstellen an

moin moin ihr da,

ich bin gerade dabei, einen kleinen e-shop zu basteln (da es nur recht wenige artikel sind und ich sowieso bei strato hoste, bietet sich also das fertige script "mini e-shop" an.

zum testen könnt ihr euch das ja mal hier herunterladen: http://www.strato.de/service/download/shop.zip

ich habe nun folgendes problem damit, das bestimmt lösbar ist, bloss leider kenne ich mich nicht gut genug damit aus:

an dem punkt, an dem meine bestellung zusammengerechnet wird, spuckt mir der shop nur werte mit einer dezimalstelle aus (also 10,50 euro werden als 10,5 euro. runde werte werden nicht als 10,00 euro angezeigt, sondern als 10 euro.)

das sieht dann alles krumm und schief aus und wirkt auch nicht gerdae seriös finde ich. also ich würde heir nicht bestellen :-)
hat von euch jemand schonmal diesen shop ausprobiert und kann mir helfen? man müsste sich wahrscheinlich nur mit javascript auskennen, um das problem zu lösen. leider kann cih das nicht, bin aber lernwillig :-)

ich würde mich über eine schnelle antwort sehr freuen. mein testshop ist über diesen link abrufbar: http://www.fruit-express.de/shop/start.html

dort könnt ihr ruhig herumprobieren - nachdem man seine persönlichen daten eingegeben hat und auf "weiter" clickt, kommt man nochmal zur übersicht der bestellung. hier seht ihr dann mein problem.

QUELLCODE

hier mal der quellcode der datei, die laut strato zu modifizieren ist (da kennt sich niemand wirklich mit aus - die sagen nur, dass man da irgendwie den javabefehl ändern muss)

danke für eure mithilfe!!!

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>Diefenhardt´sche Online Vinothek</TITLE>

<style type="text/css">
body, tr, td, code
 {font-family:Arial;font-size:10pt;}
</style>

<SCRIPT LANGUAGE="JavaScript">
<!--
function submitForm() {
 saveForm();
 window.location = "shopping.cgi?aktualisieren";
}

function saveForm() {
 var order = new String(getCookie("SCHLECKI_BESTELLUNG"));
 var elnam = new String();
 for (var i = 0; i < document.form.elements.length; i++){
  elnam = document.form.elements[i].name;
  if (elnam.indexOf("BT_") != "0"){
   order = delItem(order, document.form.elements[i]);
  }
 }
 for (var i = 0; i < document.form.elements.length; i++){
  elnam = document.form.elements[i].name;
  if (elnam.indexOf("BT_") != "0"){
   order = addItem(order, document.form.elements[i]);
  }
 }
 setCookie("SCHLECKI_BESTELLUNG", order);
 return null;
}

function loadForm() {
// Initialisiert das Formular
 var elnam = new String();
 var order = new String(getCookie("SCHLECKI_BESTELLUNG"));
 for (var i = 0; i < document.form.elements.length; i++){
  elnam = document.form.elements[i].name;
  if (elnam.indexOf("BT_") != "0"){
   document.form.elements[i].value = getQty(order, document.form.elements[i].name);
  }
 }
 return null;
}

function addItem(str, item2add) {
// Fuegt der Zeichenkette str den Schluessel item2add und den Wert zu
 var ival = new String (cleanInput(item2add.value));
 if (ival > 0) { str = str + item2add.name + ":" + ival + ";"}
 return str;
}

function delItem(str, item2delete) {
// Loescht aus der Zeichenkette str vom Schluessel item2delete bis zum naechsten Semikolon
 name2delete = item2delete.name + ":";
 delbgn = str.indexOf(name2delete);
 if (delbgn < 0) { return str; } // Schluessel nicht gefunden
 else {
  delend = str.indexOf(";", delbgn) + 1;
  return str.substring (0, delbgn) + str.substring (delend, str.length);
 }
}

function getQty(str, name2evaluate) {
// Ermittelt aus der Zeichenkette str den Wert zwischen Schluessel item2delete und dem naechsten Semikolon
 var objnam = new String(name2evaluate + ":");
 var delbgn = str.indexOf(objnam);
 if (delbgn < 0) { return "0"; }
 else {
  var varbgn = delbgn + objnam.length;
  varend = str.indexOf(";", delbgn);
  return str.substring (varbgn, varend);
 }
}

function cleanInput(input) {
 var str = new String(input);
 if ( str.length < 1 ) { str = "0" }
 else {
  for (var index=0; index < str.length; index++) {
   if (str.charAt(index) < "0" || str.charAt(index) > "9") {
    alert ("\nBitte nur Ziffern eingeben!\n(Das sind die Dinger von 0 bis 9 !)");
    str = "2";
   }
  }
  str++; // befreit auf einfachste weise
  str--; // von fuehrenden nullziffern
 }
 return str;
}

function setCookie (coknam, value, expires) {
 if (!expires) {
  expires = new Date();
  expires.setTime (expires.getTime() + (1000 * 60 * 60 * 24 * 31));
 }
 document.cookie = coknam + "=" + escape (value) + "; expires=" + expires.toGMTString() +  "; path=/";
 return null;
}

function getCookie (coknam) {
 var doccok = document.cookie;
 coknam = coknam + "=";
 var coklen = doccok.length;
 var cokbgn = 0;
 while (cokbgn < coklen) {
  var varbgn = cokbgn + coknam.length;
  if (doccok.substring(cokbgn, varbgn) == coknam) {
  var varend = doccok.indexOf (";", varbgn);
  if (varend == -1) varend = coklen;
  return unescape(doccok.substring(varbgn, varend));
 }
 cokbgn = doccok.indexOf(" ", cokbgn) + 1;
 if (cokbgn == 0) break;
 }
 return "";
}

function delCookie (coknam) {
 document.cookie = coknam + "=" + "; expires=Thu, 01-Jan-70 00:00:00 GMT" +  "; path=/";
 return null;
}
// -->
</SCRIPT>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></HEAD>

<BODY BGCOLOR="#F0edda" TEXT="#000000" LINK="#000000" VLINK="#000000" ALINK="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onLoad="loadForm()" onUnload="saveForm()">
<FORM NAME="form">
  <P><font size="2" face="Arial, Helvetica, sans-serif"><a href="%27">Weingut</a>
    / <a href="#">Online Vinothek<br>
    <br>
    </a></font>
<TABLE BORDER="0" CELLPADDING="2" CELLSPACING="0" WIDTH="535">
    <TR>
   <TD WIDTH="412" HEIGHT="10"><font size="3" face="Arial, Helvetica, sans-serif"><strong>Warenkorb</strong></font></TD>
 <TD WIDTH="49" HEIGHT="10">&#160;</TD>
 <TD WIDTH="62" HEIGHT="10">&#160;</TD>
</TR>
    <TR>
      <TD COLSPAN="3"> </TD>
</TR>
    <TR>
      <TD COLSPAN="3"> </TD>
    </TR>
<TR>
   <TD><CODE><B><font face="Arial, Helvetica, sans-serif">Produkt<br>
        <br>
        </font></B></CODE></TD>
   <TD ALIGN="RIGHT" valign="top"> <div align="right"><CODE><B><font face="Arial, Helvetica, sans-serif">Preis</font></B></CODE></div></TD>
   <TD ALIGN="CENTER" valign="top"> <div align="center"><CODE><B><font face="Arial, Helvetica, sans-serif">Flaschen</font></B></CODE></div></TD>
</TR>
<!--INS-->
<TR>
      <TD height="24" COLSPAN="3">&#160;</TD>
    </TR>
<TR>
   <TD COLSPAN="3" ALIGN="CENTER"> <div align="left">
          <INPUT NAME="BT_BACK" TYPE="BUTTON" VALUE="Zurück" onClick="history.back()">
          <!--BT_ORDER-->
        </div></TD>
</TR>
</TABLE>
<P> 
</FORM>
</BODY>
</HTML>

  1. hi,

    an dem punkt, an dem meine bestellung zusammengerechnet wird, spuckt mir der shop nur werte mit einer dezimalstelle aus (also 10,50 euro werden als 10,5 euro. runde werte werden nicht als 10,00 euro angezeigt, sondern als 10 euro.)

    number_format() bzw. printf() oder sprintf().

    gruss,
    wahsaga

    1. hi wahsaga :-)

      danke für die turbomäßige antwort. könntest du mir den exakten befehl verraten und mir die genaue stelle im quelltext zeigen, in der man das einfügen muss?

      kenn mich mit javascript null aus - danke schonmal =)

      1. hi,

        kenn mich mit javascript null aus - danke schonmal =)

        ach, wir sind hier bei javascript?
        sorry, da habe ich nicht drauf geachtet, weil ich bei "shopsystem" automatisch von einer serverseitigen technik wie PHP ausgehen - shops macht man idR. nicht in javascript.

        dann ist http://selfhtml.teamone.de/javascript/objekte/number.htm#to_fixed dein freund, wenn du eine bestimmte anzahl an nachkommastellen erzwingen willst.

        aber wo du das einsetzen musst, solltest du schon selber rausfinden - wir sind hier bei SELF-, nicht bei GEThtml ;-)

        gruss,
        wahsaga

        1. hi nochmal :-)

          ich weiss ja leider nicht genau, ob es ein javascript-problem ist :-)
          eigentlich ist es ein cgi-shop. ich habe mir den link eben mal angesehen. mit dieser funktion werden nach der zweiten dezimalstelle alle weiteren abgeschnitten.

          mein problem ist ja, dass ich zu wenige habe - nicht zu viele

          kannst du nochmal gucken? :-)

          EIN DICKES DANKE schonmal

          1. hi,

            eigentlich ist es ein cgi-shop. ich habe mir den link eben mal angesehen. mit dieser funktion werden nach der zweiten dezimalstelle alle weiteren abgeschnitten.

            also, kommen in der javascript-ausgabe noch mehrere stellen hinter dem komma an, oder sind die dort bereits "abgeschnitten"?

            kannst du nochmal gucken? :-)

            nein, durch deine unkommentierten javascript-funktionen werde ich mich jetzt nicht durchackern.

            gruss,
            wahsaga

            1. hey wahsaga,

              also hier einige beispiele:

              er zeigt "10.23" euro auch als "10.23 euro" an.
              aus "10.30" macht er "10.3".
              aus "10.00" macht er "10"
              "10.03" dagegen zeigt er wieder.

              ich sehe einfach nicht, wo das problem liegt. der shop ist so von strato (habe die dateien nur runtergeladen und dem design angepasst). an der technik hab ich nix verändert. undokumentiert = richtig. aber selber komme ich damit nicht klar. so lang is das script ja auch nicht, wenn man weiss, auf was man achten muss.

              wäre um ne hilfe sehr dankbar, weil ich den ganzen shop sonst nicht benutzen kann und die ganze arbeit für die füße gewesen wäre...

              danke schonmal

              p.s. ich kann dir auch mal die originale html-datei (natürlich virenfrei) per mail schicken, wenn du willst.

              1. hi,

                er zeigt "10.23" euro auch als "10.23 euro" an.
                aus "10.30" macht er "10.3".
                aus "10.00" macht er "10"
                "10.03" dagegen zeigt er wieder.

                ich sehe einfach nicht, wo das problem liegt.

                das "problem" ist, dass eigentlich so gut wie jede programmiersprache beim internen ablegen von zahlen im speicher lediglich die signifikanten stellen berücksichtigt.
                10.30 und 10.3 sind mathematisch gesehen die gleichen werte - also wozu die vollkommen wertlose 0 noch mit abspeichern?

                wenn ein solcher zahlwert bei der _ausgabe_ wieder "schön" formatiert werden soll, dann ist es aufgabe des programmierers, dafür zu sorgen.

                wäre um ne hilfe sehr dankbar, weil ich den ganzen shop sonst nicht benutzen kann und die ganze arbeit für die füße gewesen wäre...

                hilfe hast du bekommen, in form von tipps, wo du anzusetzen hast, und einer erklärung, wo dein denkfehler bzw. unverständnis der problematik liegt.

                p.s. ich kann dir auch mal die originale html-datei (natürlich virenfrei) per mail schicken, wenn du willst.

                nein, darauf legt in einem forum generell keiner wert, so lange er nicht _explizit_ dazu auffordert.

                gruss,
                wahsaga

                1. naja,

                  dann vielen dank für deine tips, mit denen ich leider nichts anfangen kann. ich werde mich dann wohl auf die suche nach einem shopsystem machen, das mir von vorner herein 2 dezimalstellen ausgibt.

                  die befehle, die du gepostet hast kommen ALLE nicht in menem quelltext vor - wie soll ich da irgendwie ansetzen?

                  ...was solls... vielleicht weiss jemand anderes rat?

  2. Hi,

    an dem punkt, an dem meine bestellung zusammengerechnet wird, spuckt mir der shop nur werte mit einer dezimalstelle aus (also 10,50 euro werden als 10,5 euro. runde werte werden nicht als 10,00 euro angezeigt, sondern als 10 euro.)

    Wandle die Zahl in eine Zeichenkette um. Der kannst Du Nullen anhängen - Zahlen nicht (mit toFixed() erst in der aktuellen JavaScript-Version - nicht unbedingt das, was man für einen Shop, der möglichst allen offenstehen sollte, nehmen sollte).

    http://Coding.vampirehost.de/Number-Library einbinden und die Zahl mit dez(euro,2) anzeigen lassen (wobei euro die Zahl repräsentiert).

    Oder dez(euro,0,2,"","",",") nehmen, dann wird statt des Dezimalpunkts ein Komma angezeigt.

    Gruß, Cybaer