Avatar billede Slettet bruger
07. juli 2002 - 00:57 Der er 17 kommentarer og
1 løsning

Parse 3 teskfeler og udskrive resultatet.

Jeh har 3 tekstfelter, der hver indeholder et tal i formatet tusindekr.kr,ører

Eksempler herpå er

23,00
1.020,25
0,00
160,26

Disse 3 felter skal jeg have lagt sammen og udskrevet resultatet i endnu en tekstbox.

Jeg har tidligere benyttet parseFloat, men det giver sjove resultater nu.

Her er min tidl. kode:

<select style="width:200px" name="metode1" onchange="this.form.omkostning1.value=this.value+' kr';this.form.pris_i_alt.value=parseFloat(this.form.omkostning1.value)+parseFloat(this.form.omkostning2.value)+parseFloat(this.form.pris.value)+' kr'">

Det er altså stykket med

this.form.omkostning1.value=this.value+' kr';this.form.pris_i_alt.value=parseFloat(this.form.omkostning1.value)+parseFloat(this.form.omkostning2.value)+parseFloat(this.form.pris.value)+' kr'

Der giver problemer.

Hvordan løser jeg det?
Avatar billede muddi Praktikant
07. juli 2002 - 07:58 #1
Problemet er at javascript bruger , som tusindseperator og . som decimaltegn ligesom englænderne! I danmark bruger vi vist den franske model, som du beskriver i dit spm.

Der findes adskillige javascriptfunktioner på nettet, som kan beregne det for dig!

Skide ærgeligt, for jeg har faktisk (i dag) slettet et godt script til det, som jeg havde liggende på min server... :o(

Skulle bare have vidst at nogen kunne bruge det...

Et stort problem med JS er at du ikke sådan lige kan få det til at skrive
0.00 her vil JS nemlig lave det om til 0
10.20 bliver til 10.2 osv.
Avatar billede Slettet bruger
07. juli 2002 - 10:05 #2
Jeg har ledt og ledt men kan ikke finde noget der kan hjælpe den rette vej.

Er der ikke nogen der kan hitte u a det?
Avatar billede gryn Nybegynder
07. juli 2002 - 12:32 #3
Jeg tror godt, jeg ka hitte u a det... jeg vender tilbage senere i dag.
Avatar billede Slettet bruger
07. juli 2002 - 12:37 #4
Lyder dælme godt! ;)
Avatar billede =maddog= Nybegynder
07. juli 2002 - 17:30 #5
function parseDKFloat(str) {
temp = str.replace(/\x2e/g,'').replace(/,/g,'.');
return parseFloat(temp);
}
sværere er det ikke.
"1.235,67" -> 1235.67
"34.356.123,45" -> 34356123.45
"2,50" -> 2.5
Avatar billede =maddog= Nybegynder
07. juli 2002 - 17:40 #6
og den giver fejl hvis man giver den en float eller int i stedet for en String. Vi forbedrer den lige
function parseDKFloat(str) {
    if (str.constructor==String) {
        temp = str.replace(/\x2e/g,'').replace(/,/g,'.');
        return parseFloat(temp);
    } else if (str.constructor==Number) {
          return str;
    } else return 0.0;
}
Avatar billede Slettet bruger
07. juli 2002 - 20:46 #7
maddog> Det er jo meget godt, men det løser ikke rigtigt mit problem.

Resultatet skal jo udskrives som

1.234,50

og ikke 1234.50

Så jo, det er sværere end det ser ud til.
Avatar billede =maddog= Nybegynder
07. juli 2002 - 21:23 #8
oki doki. du bruger funktionen fra før til at lægge dem sammen. (altså lave dem om til tal, så vi kan lave matematik på den).
Og så bruger du den her (det blev en længere historie, for jeg vill gerne lave den så den også virker på uendeligt store tal

function DKNumberFormat(num,decimals) {
  if (num.contructor!=Number) num = parseDKFloat(num); // uha vi kunne få knas i maskinen
  num = (num+"").replace('.',','); // 123.5 -> "123,5"
  if (num.indexOf(',') != num.length-3) { // vi har mere eller mindre end to decimaler
      if (num.indexOf(',') == num.length-2) num += "0"; // en decimal, tilføj 0
    else if (num.indexOf(',') == -1) num += ",00" // ingen decimal, tilføj ,00
    else num = num.substring(0,num.length-1) // flere decimaler, skær overskydende
  } // vi har det nu på formen xxxxxxxx,xx
  if (num.length > 6) { // vi må igang med tusindtals-seperator
    mtt=num.substring(0,num.length-6); //delen mere end tusinde
    ltt=num.substring(num.length-6,num.length); //delen mindre end tusinde
    while (mtt.length > 3) { // bliv ved indtil vi max har 3 tal
      ltt = mtt.substring(mtt.length-3,mtt.length)+"."+ltt;
      mtt = mtt.substring(0,mtt.length-3);
    }
    num = mtt+"."+ltt;
  }
  return num;
}


jeg har forsøgt at sætte kommenteringer ind så du ved hvad der sker
Avatar billede =maddog= Nybegynder
07. juli 2002 - 21:34 #9
ok. vi får en fejl, hvis vi giver en et tal med længden 1, for så bliver num.length-2 til -1 og den tror fejlagtigt der er en decimal. det løses ved at erstate

if (num.indexOf(',') == num.length-2) num += "0"; // en decimal, tilføj 0

med

if (num.indexOf(',') == num.length-2 && num.length!=1) num += "0"; // en decimal, tilføj 0
Avatar billede =maddog= Nybegynder
07. juli 2002 - 21:38 #10
og der er en fejl mere (tju hej hvor det går, men man vil jo gerne være hurtig) i parseDKFloat
Hvis vi giver den en meningsløs streng som "Brian" eller "Tusind" returnerer den NaN (Not a Number). Det dutter ikke. Erstat

return parseFloat(temp);

med

return (isNaN(parseFloat(temp)))?0.0:parseFloat(temp);
Avatar billede Slettet bruger
07. juli 2002 - 21:42 #11
Supercool! Nu virker det jo som det skal. En god smøre du der fik strikket sammen, jeg er ikke sikker på hvad den gør, men godt med kommentarer.

Det er vel noget med at tage hver tredie tal og så tjekke længden af det samlede tal...

Tak for hjælpen!
Avatar billede Slettet bruger
07. juli 2002 - 21:46 #12
Jeg har tilføjet din sidste rettelse. Det var lige prikken over i'et!
Avatar billede =maddog= Nybegynder
07. juli 2002 - 21:49 #13
du mener while løkken?
ja. vi saver tre tal af og ligger den til ltt sammen med "."
hvis foreksempel vi har "123456789,00" får vi først
ltt = "789,00" (de sidste 6)
mtt = "123456" (resten)
while ("123456" er længere end 3) { (det er den. forsæt)
ltt = "456" + "." + "789,00" -> "456.789,00"
mtt = "123"
}
en gang til
whlie ("123" er længere end 3) { (nix det er den ikke. stop)
}
til sidst
num = "123" + "." + "456.789,00" -> "123.456.789,00"
ganske fikst.
Avatar billede gryn Nybegynder
07. juli 2002 - 23:36 #14
ØV...ØV!

Nu havde jeg endelig lavet det.
Nå... men du kan jo få det alligevel... jeg har jo ikke noget at bruge det til selv.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<TITLE>Beregn http://www.eksperten.dk/spm/233187</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1252">

<script language="javascript" type="text/javascript">

tus_arr = new Array(4);
tus_arr[1] = 0
tus_arr[2] = 0
tus_arr[3] = 0
norm_arr = new Array(4);
norm_arr[1] = 0
norm_arr[2] = 0
norm_arr[3] = 0
deci_arr = new Array(4);
deci_arr[1] = 0
deci_arr[2] = 0
deci_arr[3] = 0

function ulrik(argtal, hvem) {


//Sætter tusinde i tus_arr, hvis det er nødvendigt
    if (argtal.length > 7) {
    tus_arr[hvem] = argtal.substr(0, argtal.length - 7);
    }
    else {
    tus_arr[hvem] = 0;
    }

//Sætter tallene mellem . og , i norm_arr.
norm_arr[hvem] =  argtal.substring(0, argtal.length - 3);
if (norm_arr[hvem].length > 3) {norm_arr[hvem] =  norm_arr[hvem].substring(norm_arr[hvem].length - 3, norm_arr[hvem].length);}

//Sætter deci_arr
deci_arr[hvem] =  argtal.substring(argtal.length - 2, argtal.length);

deci = deci_arr[1]*1 + deci_arr[2]*1 + deci_arr[3]*1
temp = 0
    deci = deci + "";
    if (deci > 99)
    {
    temp = deci.substring(0,1);
    deci = deci.substring(1,3);
    }
norm = norm_arr[1]*1 + norm_arr[2]*1 + norm_arr[3]*1 + temp*1
    if (norm > 999)
    {
    norm = norm + "";
    temp = norm.substring(0,1);
    norm = norm.substring(1,4);
    }
tus = tus_arr[1]*1 + tus_arr[2]*1 + tus_arr[3]*1 + temp*1

if (deci.length == 1) {
deci = "0" + deci
}
    if (tus > 0) {
    result = tus + "." + norm + "," + deci
    }
    else
    {
    result = norm + "," + deci
    }

document.minform.resultat.value = result;
}
</script>

</head>
<body>

<form name="minform">
<input type="text" size="6" name="tal1" onchange="ulrik(this.value, 1)"><br>
<input type="text" size="6" name="tal2" onchange="ulrik(this.value, 2)"><br>
<input type="text" size="6" name="tal3" onchange="ulrik(this.value, 3)"><br>
<br>
<input type="text" size="6" name="resultat" readonly><br>
</form>

</body>
</html>
Avatar billede Slettet bruger
08. juli 2002 - 00:21 #15
Det skal du ikke være ked af gryn. Der er forhåbentlig nogen der får brug for noget lignende, og så kan de jo se begge løsninger.

Desuden synes jeg det var lærerigt, da I trods alt greb opgvaen lidt forskelligt an.

En problem med flere løsninger :)
Avatar billede gryn Nybegynder
08. juli 2002 - 17:01 #16
Tja... Så blev jeg den erfaring rigere :-)
Det var nu også meget skægt at lave det.
Avatar billede =maddog= Nybegynder
08. juli 2002 - 17:23 #17
gryn> der er nemlig det. det er derfor vi sidder i pizzaæsker og cola-flasker op til halsen bag den flimrende skærm hver eneste dag.
du må da indrømme at min kode er rimelig elegant, selvom jeg så gerne indrømmer at din sikkert er lettere at tilpasse andre løsninger.
Avatar billede gryn Nybegynder
10. juli 2002 - 19:33 #18
=maddog= -> Jo. Den er flot! ;-) Det er den da.jeg så også en række andre (og nok lettere) måder at løse problemet på, da jeg havde lavet det færdigt :-)
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