Avatar billede tjaz Nybegynder
12. maj 2006 - 11:59 Der er 11 kommentarer og
1 løsning

Lægge værdier sammen?

Hej,

Jeg har en side, hvor jeg godt kunne tænke mig at have en
<input type="text" name="total"> som løbende opdatere en værdi der bliver udregnet ved at lægge 3 felter sammen:

<input type="text" name="tal1">
<input type="text" name="tal2">
<input type="text" name="tal3">

Jeg går ud fra at dette kan gøres let med javascript, men er ikke helt klar over hvordan :(
Avatar billede webudvikleren Nybegynder
12. maj 2006 - 12:24 #1
Virker, men nok ikke det bedste :-):


<script type="text/JavaScript">
function wu()
{
    tal1 = document.getElementById('tal1');
    tal2 = document.getElementById('tal2');
    tal3 = document.getElementById('tal3');

    var stykke = tal1+tal2+tal3;

    document.getElementById('total').value = stykke;
}

</script>


<form action="" method="post" onSubmit="wu();return false;">
    <input type="text" id="tal1" name="tal1" />
    <input type="text" id="tal2" name="tal2" />
    <input type="text" id="tal3" name="tal3" />
    <input type="text" id="total" name="total" />

    <br />

    <input type="submit" value="Regn!" />
</form>
Avatar billede thesurfer Nybegynder
12. maj 2006 - 12:27 #2
<script type="text/JavaScript">
function laeg_sammen(f)
{

    tal1 = f.tal1.value.replace(",", "."); // erstat "," med "." da JavaScript regner med ".", og ikke ","
    tal2 = f.tal2.value.replace(",", "."); // erstat "," med "." da JavaScript regner med ".", og ikke ","
    tal3 = f.tal3.value.replace(",", "."); // erstat "," med "." da JavaScript regner med ".", og ikke ","

    // kør funktionen sidste_tegn_ej_tal som checker om det sidste tegn er et ".".. Resultatet skulle gerne være "false":
    if (!sidste_tegn_ej_tal(tal1) && !sidste_tegn_ej_tal(tal2) && !sidste_tegn_ej_tal(tal3))
    {
        f.total.value = +tal1 + +tal2 + +tal3; // læg tal sammen
        f.total.value = f.total.value.replace(".", ","); // erstat "." med "," da man bruger "," og ikke "."
    }
}

function sidste_tegn_ej_tal(inputvalue)
{
  // sammenlign det sidste tegn med "."
    if (inputvalue.substring(inputvalue.length - 1) == ".")
    {
        // hvis det sidste tegn er ".", er resultatet "true"
        return true;
    } else {
        // hvis det sidste tegn IKKR er ".", er resultatet "false"
        return false;
    }
}
</script>

<form>
<input type="text" name="tal1" onkeyup="laeg_sammen(this.form)">
<input type="text" name="tal2" onkeyup="laeg_sammen(this.form)">
<input type="text" name="tal3" onkeyup="laeg_sammen(this.form)">
<br>
<input type="text" name="total">
</form>
Avatar billede tjaz Nybegynder
12. maj 2006 - 12:31 #3
Alt for lækkert!! ... takker!
Avatar billede thesurfer Nybegynder
12. maj 2006 - 12:31 #4
webudvikleren> Lige et par ting..

1) Der er en fejl i denne linie: var stykke = tal1+tal2+tal3;
Hvis man skriver 1 i tal1, 2 i tal2 og 3 i tal3, bliver resultatet: 123

Hvis man bruger linien f.total.value = +tal1 + +tal2 + +tal3; med samme tal, bliver resultatet 6, hvilket er korrekt.

2) Din kode opdaterer ikke "total" løbende.. jeg har brugt onkeyup til dette formål.

3) Hvis du vil bruge en onsubmit, skal det se sådan ud:
onsubmit="return wu()"
Din funktion skal så have denne linie, som sidste linie: return false;
Avatar billede thesurfer Nybegynder
12. maj 2006 - 12:40 #5
4) Du mangler ".value" på talX (1-3) linierne:
    tal1 = document.getElementById('tal1').value;
    tal2 = document.getElementById('tal2').value;
    tal3 = document.getElementById('tal3').value;
Avatar billede webudvikleren Nybegynder
12. maj 2006 - 12:40 #6
Ah ja, det rigtigt nok, jeg må beklage.
Avatar billede olebole Juniormester
12. maj 2006 - 17:55 #7
<ole>

Tal, der kommer fra tekst-inputs opfattes som oftest som strenge. Replace-funktionene virker jo som bekendt kun på tekst-strenge (den er en metode på String-objektet) - så når man har kørt den, er JS helt sikker på, du vil betragte værdien som en streng  ;o)
   
    tal1 = parseFloat( f.tal1.value.replace(",", ".") );

- så er der igen tale om tal, der vil blive lagt korrekt sammen ... og 1+2+3 giver 6  :)

/mvh
</bole>
Avatar billede olebole Juniormester
12. maj 2006 - 17:56 #8
- og det samme skal du naturligvis gøre ved de andre felt-værdier  :)
Avatar billede thesurfer Nybegynder
13. maj 2006 - 23:47 #9
:-)
Avatar billede olebole Juniormester
14. maj 2006 - 00:19 #10
Da det jo er et tilbagevendende problem, kunne man passende lave en lille wrapper (- og lægge den på JS' Math-objekt, så den ligger, hvor den hører til):

Math.str2dec = function(n){return parseFloat(n.replace(",","."))};

var tal = "123,456";
tal = Math.str2dec(tal);
alert(tal + 12);
Avatar billede olebole Juniormester
14. maj 2006 - 01:05 #11
- og skal man lave beregninger i en form, kunne man jo udvide lidt og skrive disse to i toppen af dokumentet:

Math.str2dec = function(n){return parseFloat(n.replace(",","."))};
Math.round2dec = function(n,nD){m=this;k=m.pow(10,nD);return m.round(m.str2dec(n)*k)/k};

// Eksempel:
var tal = "123,456";
alert( Math.str2dec(tal) );
alert( Math.round2dec(tal, 2) );
Avatar billede olebole Juniormester
14. maj 2006 - 01:26 #12
- mjaaahhh ... den er vist ikke helt 'idiotsikker'  :)

Math.str2dec = function(n){return parseFloat((n+"").replace(",","."))};

Så er det ligemeget, om man fylder tal eller strenge i begge metoder  :)
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