Avatar billede kynaite Nybegynder
17. august 2006 - 17:49 Der er 37 kommentarer og
1 løsning

formatering med tusindeseperator

Hej Eksperter,

Jeg har ingen erfaring med Javascript men har en tal variabel der skal formateres så fx 1000000 vises 1,000,000. Nedenfor vises koden:
  function calc2()
  {
  var t1 = document.koeb_bud.maengde;
  var t2 = document.koeb_bud.unit_price;
  var resultat = 0;

  if(t1.value != "")
    resultat = parseInt(t1.value) * t2.value;

  if(t2.value != "")
    resultat = t2.value * parseInt(t1.value) ;

  koeb_bud.bud_nu.value = resultat;
  koeb_bud.bud_nu.value = resultat.toFixed(0);

  return true;
  }
  </script>

Som i nok kan se så er det variablen resultat der skal formateres til at vises med tusinde seperator. Jeg har i forvejen formateres tallet så der ikke medtages decimaler.

På forhånd tak.
Avatar billede thesurfer Nybegynder
17. august 2006 - 19:06 #1
Hvad er meningen med disse linier?:

  if(t1.value != "")
    resultat = parseInt(t1.value) * t2.value;

  if(t2.value != "")
    resultat = t2.value * parseInt(t1.value) ;

- Hvis t1's værdi ikke er tom, skal den ganges med t2's værdi, som KAN være som
- Hvis t2's værdi ikke er tom, skal den ganges med t1's værdi, som KAN være som

Det ser ikke sæligt logisk ud..

Og hvad gør du, hvis både t1's værdi og t2's værdi er tom? - Så har du et problem, da "resultat" ikke eksisterer, men den vil alligevel prøve på at sætte koeb_bud.bud_nu.value til resultatets værdi..
Avatar billede thesurfer Nybegynder
17. august 2006 - 19:07 #2
Rettelse: "som KAN være som" = "som KAN være tom"
Avatar billede kynaite Nybegynder
17. august 2006 - 19:17 #3
hehe, forstår godt du synes det ser ret ulogisk ud med de to if statements men scriptet fungerer perfekt på den form jeg kalder funktionen. Problemet er bare at selve tallet (resultat) skal formateres til at indeholde tusindeseperator. Hvis du kan svare på det er du en helt.
Avatar billede kynaite Nybegynder
17. august 2006 - 19:20 #4
Og hvad gør du, hvis både t1's værdi og t2's værdi er tom? - Så har du et problem, da "resultat" ikke eksisterer, men den vil alligevel prøve på at sætte koeb_bud.bud_nu.value til resultatets værdi..
--> Scriptet bruges til at lave realtime udregning i et budsystem og maengde eksisterer altid da det hentes fra db og unit_price er det brugeren selv indtaster så at begge felter er tomme vil aldrig forekomme.
Avatar billede thesurfer Nybegynder
17. august 2006 - 19:24 #5
Jeg har faktisk overset "var resultat = 0;", så værdien sættes til 0, hvis t1 og t2 ikke indeholder noget.. :-)
Avatar billede kynaite Nybegynder
17. august 2006 - 19:25 #6
hehe ok :)
Avatar billede Slettet bruger
17. august 2006 - 20:17 #7
Uden at have testet tror jeg du skal lege med noget alá nedenstående:

function format(iValue) {
  var sResult = "";
  var iTmp = iValue;
  while (iTmp != 0) {
    iMod = iTmp % 1000;//Rest ved division med 1000
    iTmp = (iTmp - iMod) / 1000;//Fjern tusinder fra iTmp
    sResult = iTmp == 0 ? iMod + sResult : "," + appendZero(iMod) + sResult;//appendZero skal sikre at der er det korrekte antal 0'er så f.eks. 99 bliver til 099 og 0 bliver til 000.
  }

  return sResult;
}
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:21 #8
jjust> Hmm.. Jeg kunne ikke få din kode til at virke..

kynaite> Jeg kunne ikke finde koden, og havde problemer med % (mod), så jeg laved det med loop..

Meget primitivt kode:

function kommatal(v)
{
    t = ""; a = "" + v;
    for(i=a.length-1; i >= 0; i--) t += a.substr(i,1);

    a = t; t = ""; c = 0;
    for(i=0; i < a.length + 1; i++)
    {
        c++;
        t += a.substr(i,1);
        if (c == 3)
        {
                t += ".";
                c = 0;
        }
    }

    a = t; t = "";
    for(i=a.length-1; i >= 0; i--) t += a.substr(i,1);

    return t;
}

Kaldes sådan her: kommatal(1234567)

eksempel: koeb_bud.bud_nu.value = kommatal(resultat);

Husk at fjerne linien koeb_bud.bud_nu.value = resultat.toFixed(0);
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:23 #9
Ahh.. jeg har lige fundet en fejl..
Resultatet bliver forkert, hvis tallet indeholder et kommatal..

Eksempel: 1234567.89
Avatar billede kynaite Nybegynder
17. august 2006 - 20:39 #10
Ja ok, selve koden virker men som du selv siger du fejler den såsnart unit_price indeholder . eller ,. Derudover vises fx 100000 som 100,000, og den sidste seperator skal selvfølgelig ik være der.
Avatar billede kynaite Nybegynder
17. august 2006 - 20:39 #11
Men vi er da godt på vej? :D
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:43 #12
Rettelsen til "100,000," er: if (c == 3 && i != a.length-1)

Rettelsen skal bare ersatte linie fra den forrige kode..
Avatar billede kynaite Nybegynder
17. august 2006 - 20:44 #13
Ja det virker bare! Så mangler der bare problemet med når . , er indeholdt i tallet?
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:49 #14
Jeg kom faktisk til at bruge "." i stedet for ","..

Her er rettelsen:

function kommatal(v)
{
    k = "";
    t = ""; a = "" + v;
    alert(a);
    if (a.indexOf(".") >-1)
    {
        k = a.substring(a.indexOf("."));
        a = a.substring(0, a.indexOf(".") -1);
        alert(k);
    }


    for(i=a.length-1; i >= 0; i--) t += a.substr(i,1);

    a = t; t = ""; c = 0;
    for(i=0; i < a.length + 1; i++)
    {
        c++;
        t += a.substr(i,1);
        if (c == 3 && i != a.length-1)
        {
                t += ",";
                c = 0;
        }
    }

    a = t; t = "";
    for(i=a.length-1; i >= 0; i--) t += a.substr(i,1);

    return t + k;
}

Test f.eks. med: 1234567.89
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:51 #15
Hmm.. der er stadigvæk fejl.. kigger lige på det..
Avatar billede Slettet bruger
17. august 2006 - 20:53 #16
Jeg har tilføjet appendZero funktionen som jeg havde udeladt før!

Nedenstående skulle gerne virke, såfremt format bliver kaldt med et positivt tal!

function format(iValue) {
  var sResult = "";
  var iTmp = iValue;
  while (iTmp != 0) {
    iMod = iTmp % 1000;
    iTmp = (iTmp - iMod) / 1000;
    sResult = iTmp == 0 ? iMod + sResult : "," + appendZero(iMod) + sResult;
  }
  return sResult; 
}
         
//0 <= iValue < 1000
function appendZero(iValue) {
  if (iValue < 10)
    return "00" + iValue;
  if (iValue < 100)
    return "0" + iValue;
  return iValue;
}
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:53 #17
Sådan:

function kommatal(v)
{
    k = "";
    t = ""; a = "" + v;
    if (a.indexOf(".") >-1)
    {
        k = a.substring(a.indexOf("."));
        a = a.substring(0, a.indexOf("."));
    }


    for(i=a.length-1; i >= 0; i--) t += a.substr(i,1);

    a = t; t = ""; c = 0;
    for(i=0; i < a.length + 1; i++)
    {
        c++;
        t += a.substr(i,1);
        if (c == 3 && i != a.length-1)
        {
                t += ",";
                c = 0;
        }
    }

    a = t; t = "";
    for(i=a.length-1; i >= 0; i--) t += a.substr(i,1);

    return t + k;
}
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:55 #18
jjust> Har du prøvet med kommatal?
"1234567.89" giver "1,234,567.8899999998976"

Så der skal vist lige rundes af eller noget..
Avatar billede kynaite Nybegynder
17. august 2006 - 21:08 #19
thesurfer >> det virker perfekt! :) ka det afrundes til 2 decimaler osm det sidste så?
Avatar billede kynaite Nybegynder
17. august 2006 - 21:12 #20
har lige fundet en lille fejl, hvis beløbet er 5-cifret fx 22000 skrives det stadig med komma til sidst >> 22,000,
Avatar billede kynaite Nybegynder
17. august 2006 - 21:17 #21
fattede selv lige at afrunde det, så det er løst :)
Avatar billede thesurfer Nybegynder
17. august 2006 - 21:31 #22
Hvordan ser koden ud nu?
Avatar billede kynaite Nybegynder
17. august 2006 - 21:33 #23
<script language="javascript">
function kommatal(v)
{
    k = "";
    t = ""; a = "" + v;
    if (a.indexOf(".") >-1)
    {
        k = a.substring(a.indexOf("."));
        a = a.substring(0, a.indexOf("."));
    }


    for(i=a.length-1; i >= 0; i--) t += a.substr(i,1);

    a = t; t = ""; c = 0;
    for(i=0; i < a.length + 1; i++)
    {
        c++;
        t += a.substr(i,1);
        if (c == 3 && i != a.length-1)
        {
                t += ",";
                c = 0;
        }
    }

    a = t; t = "";
    for(i=a.length-1; i >= 0; i--) t += a.substr(i,1);

    return t + k;
  }
 
 
  function calc2()
  {
  var t1 = document.koeb_bud.maengde;
  var t2 = document.koeb_bud.unit_price;
  var resultat = 0;

  if(t1.value != "")
    resultat = parseInt(t1.value) * t2.value;

  if(t2.value != "")
    resultat = t2.value * parseInt(t1.value) ;

  koeb_bud.bud_nu.value = resultat;
  koeb_bud.bud_nu.value = kommatal(resultat.toFixed(0));


  return true;
  }
  </script>
Avatar billede thesurfer Nybegynder
17. august 2006 - 21:34 #24
En simpel løsning på "komma før tal":

    if (t.substring(0,1) == ",") t = t.substring(1);
    return t + k;
Avatar billede thesurfer Nybegynder
17. august 2006 - 21:35 #25
Testet med:

kommatal(1);
kommatal(12);
kommatal(123);
kommatal(1234);
kommatal(12345);
kommatal(123456);
kommatal(1234567);
kommatal(12345678);
kommatal(123456789);
kommatal(1234567890);
kommatal(1234567890.89);

Giver:

1
12
123
1,234
12,345
123,456
1,234,567
12,345,678
123,456,789
1,234,567,890
1,234,567,890.89
Avatar billede kynaite Nybegynder
17. august 2006 - 21:36 #26
ok great...ska den bare smides ind?
Avatar billede Slettet bruger
17. august 2006 - 21:40 #27
Nu er det jo selvfølgelig ikke relevant mere, men jeg fik rettet mine fejl, så her er et virkende alternativ :)
         
function format(iValue) {
  if (iValue >= 0)
    return formatPositive(iValue);
  return "-" + formatPositive(-1*iValue);
}

function formatPositive(iValue) {
  var sResult = "";
  var iTmp = Math.floor(iValue);
  var sTmp = "" + iValue;
  var iIndexOfDecimals = sTmp.indexOf('.');
  var sDecimals = iIndexOfDecimals > -1 ? sTmp.substring(iIndexOfDecimals, sTmp.length) : "";
  while (iTmp != 0) {
    iMod = iTmp % 1000;
    iTmp = (iTmp - iMod) / 1000;
    sResult = iTmp == 0 ? iMod + sResult : "," + appendZero(iMod) + sResult;
  }
  return sResult + sDecimals; 
}
 
//0 <= iValue < 1000
function appendZero(iValue) {
  if (iValue < 10)
    return "00" + iValue;
  if (iValue < 100)
    return "0" + iValue;
  return iValue;
}
Avatar billede thesurfer Nybegynder
17. august 2006 - 21:40 #28
Ny kodeblok erstatter gammel kodeblok :-)

Find det der ligner, i den gamle kode, og erstat med den nye kode..
Avatar billede kynaite Nybegynder
17. august 2006 - 21:47 #29
Fantastisk arbejde thesurfer! :) det virker. Og til jjust det virker også - bare lige for at gi lidt credit til indsatsen.
Avatar billede kynaite Nybegynder
17. august 2006 - 21:48 #30
svar
Avatar billede kynaite Nybegynder
17. august 2006 - 21:48 #31
smid et svar :)
Avatar billede thesurfer Nybegynder
17. august 2006 - 21:51 #32
Svar smidt :-)

Jeg synes også at jjust skal have en bid af kagen.. :-)
Avatar billede kynaite Nybegynder
17. august 2006 - 21:53 #33
yes...hvordan ka jeg gøre d? :) første gang  jeg poster her...
Avatar billede thesurfer Nybegynder
17. august 2006 - 21:59 #34
Du skal lige vente på at jjust også lægger et svar.. så kan du markere begge navnet i boksen til venstre (der står kun "thesurfer" lige nu) og derefter klikke på Accepter-knappen..
Avatar billede thesurfer Nybegynder
17. august 2006 - 21:59 #35
Du kan normalt læse om brugen af eksperten.dk på siden http://www.expfaq.dk/ , men den er nede lige nu..
Avatar billede thesurfer Nybegynder
17. august 2006 - 22:05 #36
Doh :-)

Jeg venter lige for at høre om jjust vil have points.. hvis ja, opretter jeg et spørgsmål til ham/hende, så han/hun kan få points.. :-)
Avatar billede Slettet bruger
18. august 2006 - 15:42 #37
Nej nej, ingen point er nødvendige!
Avatar billede roenving Novice
19. august 2006 - 12:03 #38
-- og en genial algoritme, som jeg ikke lige kan huske, hvem der fandt på den:

<form>
100000<input type="checkbox" value="100000" onclick="this.form.tal.value=ins1000Sep(this.value);"><br>
1000000,15<input type="checkbox" value="1000000,15" onclick="this.form.tal.value=ins1000Sep(this.value);"><br>
Tal: <input type="text" name="tal"><br>
<button onclick="this.form.tal.value=rem1000Sep(this.form.tal.value);">Fjern tusind-separatorer</button>
<button onclick="this.form.tal.value=ins1000Sep(this.form.tal.value);">Indsæt tusind-separatorer</button>
</form>

<script type="text/javascript">
function ins1000Sep(val){
  val = val.split(",");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].replace(/(\d{3})/g,"$1.");
  val[0] = val[0].split("").reverse().join("");
  val[0] = val[0].indexOf(".")==0?val[0].substring(1):val[0];
  return val.join(",");
}
function rem1000Sep(val){
  return val.replace(/\./g,"");
}
</script>
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