Avatar billede Keld Nielsen Professor
09. juli 2006 - 11:24 Der er 21 kommentarer og
1 løsning

Mange tal ganges med en faktor

Jeg har nogle sider, hvor der er mange tal (beløb med to decimaler = ##.###,##)
Jeg ville gerne sætte det op så jeg i koden (headeren) kunne sætte gangefaktoren, som valutaberegning: tal*faktor (faktoren har også to decimaler).
Det skal så gerne slår igennem på alle de indtastede tal.

Er der nogen der har en idé om hvordan jeg kan gribe det an?
Avatar billede jonashn Nybegynder
10. juli 2006 - 08:04 #1
Indtastes tallene i en form, eller står de i brødteksten?
Avatar billede Keld Nielsen Professor
10. juli 2006 - 08:24 #2
Tallene står i brødtekst, som f.eks 650,00, og så forestiller jeg mig at der kunne siges 650,00*faktor i HTML-teksten, som hvis faktoren var 2,00 ville resultatet altså blæive 1.300,00
Avatar billede jonashn Nybegynder
10. juli 2006 - 08:54 #3
Er det muligt at omkranse tallene med <span id="tal">123.45,23</span>?
Avatar billede Keld Nielsen Professor
10. juli 2006 - 09:08 #4
Ja, det ser jeg umiddelbart ikke nogen problem i!
Avatar billede jonashn Nybegynder
10. juli 2006 - 09:18 #5
Dejligt! :D
Avatar billede jonashn Nybegynder
10. juli 2006 - 10:18 #6
Færdig!
Du skal ændre <body> i dit dokument til <body onload="factorNums()"> og lægge nedenstående ind i <head>:

<script type="text/javascript">
//hvis Array.push ikke findes
if (typeof Array.prototype.push == 'undefined') {
    Array.prototype.push=function(txt)
    {
        return this[this.length]=txt;
    }
}

function factorNums()
{
    //init
    factor=2;
    pattern=/[0-9]{1,10}\,[0-9]{0,2}/g;
    commaClearPattern=/\,/;
   
    //deklaration af Arrays
    talSpans=new Array;
    results=new Array;
    positivities=new Array;
    temp=new Array;
       
    //læg alle spans i dokumentet ind i spans
    spans=document.getElementsByTagName("span");
   
    //læg de spans hvis id=tal ind i talSpans
    for(i=0;i<spans.length;i++)
    {
        if(spans[i].getAttribute('id')=="tal")
        {
            talSpans.push(spans[i]);
        }
    }
   
    //tjek om hver enkelt talspan indeholder et nummer efter pattern-skabelonen,
    //og læg dem der gør ind i results.
    //Alle i'erne lægges ind i positivities.
   
    for(i=0;i<talSpans.length;i++)
    {
        temp=talSpans[i].innerHTML.match(pattern);
        for(a=0;a<temp.length;a++)
        {
            if(!temp[a]==null||!temp[a]=="undefined");
            {
                results.push(temp[a]);
                positivities.push(a);
            }
        }
    }

    //gang alle results med factor og indsæt dem i dokumentet.
    for(i=0;i<results.length;i++)
    {
        results[i]=results[i].replace(/\,/g,".")+0;
        talSpans[i].innerHTML=(results[i]*factor)+0;
    }
}
</script>

for at ændre det som tallene skal ganges med ændrer du bare i factor.
Alle tal skal have formatet <span id="tal">##,##</span>? (der må self gerne være flere numre end i eksemplet, heltallet er op til 10 cifre og decimalerne er op til 2).
Hvis der skal være "forståelses-punktum" ala 1.123,12 i tallene må du sige det.
Avatar billede Keld Nielsen Professor
10. juli 2006 - 10:43 #7
Hej ....
Det virker jo helt efter bogen, og ja, jeg vil meget gerne have det formateret som du nævner, også med nullere efter kommaet.

Smider gerne ekstra point!
Avatar billede jonashn Nybegynder
10. juli 2006 - 15:06 #8
Skal kommaet være ved hvert 3. tal, som 123.456.789,12?
Avatar billede Keld Nielsen Professor
10. juli 2006 - 15:51 #9
Jepper, lige akkurat !
Avatar billede jonashn Nybegynder
10. juli 2006 - 17:18 #10
Nu har jeg lavet det med . ved hvert 3. ciffer, men jeg kan ikke få den til at lave 2 nuller hvis der ikke er decimaler. Er det meget vigtigt?
Her er koden:
<script type="text/javascript">
function readingComma(num)
{
    num+="";
    splitted=num.split('.');
    spl1=splitted[0];
    spl2=splitted.length>1?"."+splitted[1]:'';
    var pattern=/(\d+)(\d{3})/;
    while(pattern.test(spl1))
    {
        spl1=spl1.replace(pattern, '$1' + '.' + '$2');
    }
    return spl1+spl2;
}

//hvis Array.push ikke findes
if (typeof Array.prototype.push == 'undefined') {
    Array.prototype.push=function(txt)
    {
        return this[this.length]=txt;
    }
}

function factorNums()
{
    //init
    factor=2;
   
    pattern=/[0-9]{1,10}\,[0-9]{0,2}/g;
    talSpans=new Array;
    results=new Array;
    //læg alle spans i dokumentet ind i spans
    spans=document.getElementsByTagName("span");
   
    //læg de spans hvis id=tal ind i talSpans
    for(i=0;i<spans.length;i++)
    {
        if(spans[i].getAttribute('id')=="tal")
        {
            talSpans.push(spans[i]);
        }
    }
   
    //tjek om hver enkelt talspan indeholder et nummer efter pattern-skabelonen,
    //og læg dem der gør ind i results.
   
    for(i=0;i<talSpans.length;i++)
    {
        temp=talSpans[i].innerHTML.match(pattern);
        for(a=0;a<temp.length;a++)
        {
            if(!temp[a]==null||!temp[a]=="undefined");
            {
                results.push(temp[a]);
            }
        }
    }

    //gang alle results med factor og indsæt dem i dokumentet.
    for(i=0;i<results.length;i++)
    {
        results[i]=(results[i].replace(/\,/g,"."))*factor;
        temp=readingComma(results[i]);
        temp=temp.split(".");
        ret="";
        for(a=0;a<temp.length;a++)
        {
            if(a==temp.length-2)
            {
                ret+=temp[a]+",";
            }
           
            else
            {
                ret+=temp[a]+".";
            }
        }
        talSpans[i].innerHTML=ret.substring(0,ret.length-2);
    }
}
</script>
Avatar billede Keld Nielsen Professor
10. juli 2006 - 17:32 #11
Det ser jo fint ud!

Ja, det der med nullerne er ret vigtigt, det er jo priser!

Jeg har noget fra et andet script liggende, kan det hjælpe dig???

function toDecimaler ( tal ) {
    if ( typeof( tal ) == String ) tal = parseFloat( tal );
    talTx = "_" +Math.round( 100.0*tal ) +"_"
    if ( talTx.length < 5 ) {
        preZero = "_000";
        talTx = preZero.substring(0,6-talTx.length) +talTx.substring(1);
    };
    talTx = talTx.substring(1,talTx.length-3) +","
            + talTx.substring(talTx.length-3,talTx.length-1);
    return talTx;
}; //end toDecimaler ( nummer ) -> String
Avatar billede Keld Nielsen Professor
10. juli 2006 - 18:30 #12
Øhhh, det var ikke helt så godt, da jeg kom til at kigge nærmere efter, prøv at se her:
http://www.prolight.dk/eksperten/gange-faktor.html
Avatar billede jonashn Nybegynder
12. juli 2006 - 10:31 #13
Hovsa- igår postede jeg et svar med rettelse, men eksperten har åbenbart misset det. Her kommer det.
Jeg har fundet fejlen, og rettet koden så man kan nøjes med at skrive ## i stedet for ##,00 som heltal i klarteksten.
Scriptet skulle gerne virke helt nu.

<script type="text/javascript">
function correctDecimals(tal) //problem: kommaerne i input forstyrrer. RET DET!
{
    tal=tal+"";
    if (typeof(tal)==String)tal=parseFloat(tal);
    if(tal.substring(tal.length-4).match(/\,[0-9][0-9]/)) return tal;
    talTx="_"+Math.round( 100.0*tal)+"_";
    if (talTx.length<5)
    {
        preZero="_000";
        talTx=preZero.substring(0,6-talTx.length)+talTx.substring(1);
    }
    talTx=talTx.substring(1,talTx.length-3)+","+talTx.substring(talTx.length-3,talTx.length-1);
    tal=talTx;


    return tal;
}

function insertDots(num)
{
        num=num.split(".");
        ret="";
        for(a=0;a<num.length;a++)
        {
            if(a==num.length-2)
            {
                ret+=num[a]+",";
            }
           
            else
            {
                ret+=num[a]+".";
            }
        }
    return ret.substring(0,ret.length-1);
}

function readingComma(num)
{
    num+="";
    splitted=num.split('.');
    spl1=splitted[0];
    spl2=splitted.length>1?"."+splitted[1]:'';
    var pattern=/(\d+)(\d{3})/;
    while(pattern.test(spl1))
    {
        spl1=spl1.replace(pattern,'$1'+'.'+'$2');
    }
    return spl1+spl2;
}

//hvis Array.push ikke findes
if (typeof Array.prototype.push == 'undefined') {
    Array.prototype.push=function(txt)
    {
        return this[this.length]=txt;
    }
}

function factorNums()
{
    //init
    factor=584.94 ;
   
    numberInitPattern=/[0-9]{1,10}\,[0-9]{0,2}/g;
    talSpans=new Array;
    results=new Array;
    //læg alle spans i dokumentet ind i spans
    spans=document.getElementsByTagName("span");
   
    //læg de spans hvis id=tal ind i talSpans
    for(i=0;i<spans.length;i++)
    {
        if(spans[i].getAttribute('id')=="tal")
        {
            talSpans.push(spans[i]);
        }
    }
   
    //tjek om hver enkelt talspan indeholder et nummer efter numberInitPattern-skabelonen,
    //og læg dem der gør ind i results.
   
    for(i=0;i<talSpans.length;i++)
    {
        if(!talSpans[i].innerHTML.match(/[0-9]{1,10}/g).length<1) talSpans[i].innerHTML+=",00";
        temp=talSpans[i].innerHTML.match(numberInitPattern);
        for(a=0;a<temp.length;a++)
        {
            if(!temp[a]==null||!temp[a]=="undefined");
            {
                results.push(temp[a]);
            }
        }
    }

    //gang alle results med factor og indsæt dem i dokumentet.
    for(i=0;i<results.length;i++)
    {
        temp="";
        results[i]=(results[i].replace(/\,/g,"."))*factor;
       
    talSpans[i].innerHTML=insertDots(readingComma(correctDecimals(results[i])));
    }   
}
</script>
Avatar billede jonashn Nybegynder
12. juli 2006 - 10:52 #14
Hovsa- det var den forkerte. Her er den rigtige:

<script type="text/javascript">
function factorNums()
{
    //init
    factor=584.94/100;
   
    numberInitPattern=/[0-9]{1,10}\,[0-9]{0,2}/g;
    numberWithoutDecimals=/[0-9]{1,10}/g;
    talSpans=new Array;
    results=new Array;

    spans=document.getElementsByTagName("span");    //læg alle spans i dokumentet ind i spans
   

    for(i=0;i<spans.length;i++)    //læg de spans hvis id=tal ind i talSpans
    {
        if(spans[i].getAttribute('id')=="tal")
        {
            talSpans.push(spans[i]);
        }
    }
   
    //tjek om hver enkelt talspan indeholder et nummer efter numberInitPattern-skabelonen,
    //og læg dem der gør ind i results.
   
    for(i=0;i<talSpans.length;i++)
    {
        if(!talSpans[i].innerHTML.match(numberWithoutDecimals).length<1) talSpans[i].innerHTML+=",00";
        temp=talSpans[i].innerHTML.match(numberInitPattern);
        for(a=0;a<temp.length;a++)
        {
            if(!temp[a]==null||!temp[a]=="undefined");
            {
                results.push(temp[a]);
            }
        }
    }

    //gang alle results med factor og indsæt dem i dokumentet.
    for(i=0;i<results.length;i++)
    {
        temp="";
        results[i]=(results[i].replace(/\,/g,"."))*factor;
        talSpans[i].innerHTML=readingComma(correctDecimals(results[i]));
    }
}

function correctDecimals(tal)
{   
    tal=tal+"";
    if (typeof(tal)==String)tal=parseFloat(tal);
    if(tal.substring(tal.length-4).match(/\,[0-9][0-9]/)) return tal;
    talTx="_"+Math.round( 100.0*tal)+"_";
    if (talTx.length<5)
    {
        preZero="_000";
        talTx=preZero.substring(0,6-talTx.length)+talTx.substring(1);
    }
    talTx=talTx.substring(1,talTx.length-3)+","+talTx.substring(talTx.length-3,talTx.length-1);
    tal=talTx;

    return tal;
}



function readingComma(num)
{
    num+="";
    splitted=num.split('.');
    spl1=splitted[0];
    spl2=splitted.length>1?"."+splitted[1]:'';
    var pattern=/(\d+)(\d{3})/;
    while(pattern.test(spl1))
    {
        spl1=spl1.replace(pattern,'$1'+'.'+'$2');
    }
    return spl1+spl2;
}

//hvis Array.push ikke findes
if (typeof Array.prototype.push == 'undefined') {
    Array.prototype.push=function(txt)
    {
        return this[this.length]=txt;
    }
}
</script>
Avatar billede Keld Nielsen Professor
12. juli 2006 - 18:40 #15
Så er det på plads ....masser af tak for hjælpen - smid et svar!
Avatar billede jonashn Nybegynder
12. juli 2006 - 19:58 #16
Svar :)
Avatar billede jonashn Nybegynder
13. juli 2006 - 10:59 #17
...og tak for pointene!
Avatar billede Keld Nielsen Professor
13. juli 2006 - 11:03 #18
Jeg har oprettet et nyt spørgsmål ...hvis du har lyst og tid:
http://www.eksperten.dk/spm/720438
Avatar billede jonashn Nybegynder
13. juli 2006 - 11:27 #19
Det kikker jeg på!
Avatar billede Keld Nielsen Professor
02. august 2006 - 17:50 #20
hej 'jonashn' har der været ferie ...eller har du ikke haft tid ad anden årsag ??
Avatar billede jonashn Nybegynder
04. august 2006 - 20:21 #21
Der har været ferie :-D

Jeg har desværre ikke tid til at lave det lige nu :( (skal i skole igen) men er der ikke en anden der vil kikke på det?
Avatar billede Keld Nielsen Professor
05. august 2006 - 10:35 #22
OK ....helt i orden, det skal jo passes først!

...det er rigtigt at der var en anden der kigge på det, men det blev desværre aldrig færdig. Jeg syntes det var en lille sag, men det er det åbenbart ikke!
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