Avatar billede mickiii Nybegynder
15. august 2005 - 16:25 Der er 14 kommentarer og
1 løsning

Formattering af tal

Hej,

Jeg står og skal bruge en funktion som kan hjælpe med følgende:

Når tal indtastes i et felt, så bliver det ændret, således at det indeholder punktum som seperator, og komma som decimal seperator. Med andre ord, det danske format. Jeg har kigget en del på andre eksempler, givet i tråde herinde, men de fejler alle ved en eller flere ting. Den skal kunne klare de fleste situationer, dvs. med input ala:
- 1000
- 1000,50
- 1.000,50
- 1000.50
- Ovenstående med modsat fortegn self...

Derudover skal den validere tallet, om det rent faktisk er et tal eller ej.
Sidst men ikke mindst skal den kunne afrunde tallet til maks 2 decimaler, dvs. ved indtastning af 100,175 returneres 100,18 osv.
Nå ja, og så ellers virke i FF og IE :)

Jeg forlanger ikke nogen skal bruge tid på at lave funktionen (medmindre de selvfølgelig har lyst), men jeg tænkte på at en eller flere herinde må have stødt på samme problematik tidligere, hvorfor de måske allerede har en lignende funktion liggende.

Jeg håber nogen er i stand til at hjælpe. Såfremt noget af ovenstående skal uddybes nærmere, så skriv endelig.

På forhånd tak.
Avatar billede busschou Praktikant
15. august 2005 - 16:28 #1
du kan jo lave en funktion som når der submittes tjekker for at der kun er maks eet komma til stede, hvis der er flere eller punktummer så give en advarsel om at det skal rettes, og så kan brugeren rette det
Dernæst behøves du jo kun at tage højde for det ene komma
Avatar billede roenving Novice
15. august 2005 - 16:37 #2
Hvordan vil du kende forskel på, at en bruger indtaster et nummer på engelsk/amerikansk maner, måske med 3 decimaler ?-)
Avatar billede mickiii Nybegynder
15. august 2005 - 16:37 #3
busschou => Ja det er selvfølgelig sandt, men jeg kunne godt tænke mig at den var så brugervenlig som overhovedet muligt, og derfor tager højde for de mest gængse indtastninger.
Avatar billede mickiii Nybegynder
15. august 2005 - 16:39 #4
roenving => ...hmm, det kan du da for så vidt have ret i... Den havde jeg faktisk ikke lige tænkt på. Men så skal den bare kunne tage højde for tal tastet med komma.
Avatar billede busschou Praktikant
15. august 2005 - 16:43 #5
grunden til jeg foreslog det jeg foreslog var netop at det er svært at tage højde for alt
Desuden hvis du skal benytte værdien serverside bagefter så skal du alligevel tjekke det igennem på serveren for at få det rigtige format :o)
Avatar billede roenving Novice
15. august 2005 - 16:48 #6
En simpel maskine til at indsætte tusind-separatorer:

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("");
  return val.join(",");
}

-- men den forudsætter, at det er skrevet i dansk format, så en eventuel decimal-adskiller er kommaet !-)
Avatar billede roenving Novice
15. august 2005 - 16:53 #7
Hrm, der manglede lige en linje:

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(",");
}
Avatar billede mickiii Nybegynder
15. august 2005 - 17:00 #8
roenving => Super, men kan du udbygge med komma seperator ',00' også hvis ikke der er tastet noget, decimal afrunding og talcheck?

Jeg ved jeg beder om lidt meget, så hvis ikke du vil er det naturligvis helt fint.
Avatar billede roenving Novice
15. august 2005 - 18:27 #9
Ikke stress-testet, men den ser ud til at opføre sig ordentligt:

<script language="javascript" type="text/javascript">
/*  num er tallet (tal eller tekst)
      decimaler er antallet af decimaler, der skal returneres med
      valuta betemmer om der sættes nuller på, hvis der ellers ingen decimaler er på
*/
function formatNumDan(num,decimaler,valuta){
  num += "";
  decs = decimaler ? (Math.pow(10,decimaler)+"").substring(1):"";
  if(num.indexOf(".")>num.indexOf(",") && num.indexOf(",")>-1 || num.indexOf(",")!=num.lastIndexOf(",")){
    num = num.replace(/,/g,"");
  }else if(num.indexOf(",")>-1 || num.indexOf(".")!=num.lastIndexOf(".")){
    num = num.replace(/\./g,"").replace(/,/g,".");
  }//else if(

  if(num.indexOf(".")==-1 && num.indexOf(",")==-1)
    return valuta?ins1000Sep(num + "," + decs):ins1000Sep(num);

  num = Math.round(+num*Math.pow(10,decimaler))/Math.pow(10,decimaler)+"";
  num += num.indexOf(".")>-1 ? decs : "." + decs;
  num = num.substring(0,num.indexOf(".") + decimaler + 1);
  return ins1000Sep(num.replace(/\./,","));
}
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(",");
}

</script>

Kald f.eks. på onchange:

<input id="minInput" name="minInput" type="text" value="Tom" onchange="this.value=formatNumDan(this.value,2,true);" onfocus="if(this.value==this.defaultValue)this.value='';" onblur="if(this.value=='')this.value=this.defaultValue;" size="20">
Avatar billede mickiii Nybegynder
15. august 2005 - 20:19 #10
roenving => Ah men det er jo klasse det der! Men, der var lige et par ting jeg ikke forstår:

Jeg har tilføjet følgende for at sikre om det er et tal eller ej,

<script language="javascript" type="text/javascript">
/*  num er tallet (tal eller tekst)
      decimaler er antallet af decimaler, der skal returneres med
      valuta betemmer om der sættes nuller på, hvis der ellers ingen decimaler er på
*/
function formatNumDan(num,decimaler,valuta){
var reg = /\d+(,\d+)?/g;
  if(!num.match(reg)){
    alert("Fejl");
    return false;
  } else {
    num += "";
    decs = decimaler ? (Math.pow(10,decimaler)+"").substring(1):"";
    if(num.indexOf(".")>num.indexOf(",") && num.indexOf(",")>-1 || num.indexOf(",")!=num.lastIndexOf(",")){
      num = num.replace(/,/g,"");
    }else if(num.indexOf(",")>-1 || num.indexOf(".")!=num.lastIndexOf(".")){
      num = num.replace(/\./g,"").replace(/,/g,".");
    }//else if(

    if(num.indexOf(".")==-1 && num.indexOf(",")==-1)
      return valuta?ins1000Sep(num + "," + decs):ins1000Sep(num);

    num = Math.round(+num*Math.pow(10,decimaler))/Math.pow(10,decimaler)+"";
    num += num.indexOf(".")>-1 ? decs : "." + decs;
    num = num.substring(0,num.indexOf(".") + decimaler + 1);
    return ins1000Sep(num.replace(/\./,","));
  }
}
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(",");
}
</script>

Nu står jeg med to problemer:
Skriver jeg f.eks. -100 eller -100000 eller -100000000 osv, så sætter den et punktum foran tallet dvs. -.100,00 - -.100.000,00 osv. Kan det lade sig gøre at rette?

Til sidst, nu er jeg på ingen måder ind i brugen af regex, men findes der en mere optimal en som acceptere både positive og negative tal, og med og uden punktummer og komma? Jeg kan ikke umiddelbart finde en på http://www.regexlib.com

På forhånd tak.
Avatar billede roenving Novice
15. august 2005 - 20:28 #11
Det'r jo godt med noget stress-testning:

<script language="javascript" type="text/javascript">
function formatNumDan(num,decimaler,valuta){
  num += "";
  if(!num.match(/^-?\d+([,\.]\d+)*$/)){
    alert("fejl");
    return "";
  }
  decs = decimaler ? (Math.pow(10,decimaler)+"").substring(1):"";

  if(num.indexOf(".")>num.indexOf(",") && num.indexOf(",")>-1 || num.indexOf(",")!=num.lastIndexOf(",")){
    num = num.replace(/,/g,"");
  }else if(num.indexOf(",")>-1 || num.indexOf(".")!=num.lastIndexOf(".")){
    num = num.replace(/\./g,"").replace(/,/g,".");
  }

  if(num.indexOf(".")==-1 && num.indexOf(",")==-1)
    return valuta?ins1000Sep(num + "," + decs):ins1000Sep(num);

  num = Math.round(+num*Math.pow(10,decimaler))/Math.pow(10,decimaler)+"";
  num += num.indexOf(".")>-1 ? decs : "." + decs;
  num = num.substring(0,num.indexOf(".") + decimaler + 1);
  return ins1000Sep(num.replace(/\./,","));
}
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].replace(/^(-?)\./,"$1");
  return val.join(",");
}
</script>
Avatar billede mickiii Nybegynder
15. august 2005 - 20:41 #12
Jamen jeg bukker og skraber - Det er jo fornemt det der. Nu mangler jeg bare at komme tilbage igen, så jeg kan regne lidt på tallene, men jeg tror nok jeg ved hvordan jeg kan gøre dette.

Skynd dig at ligge et svar :o)
Avatar billede roenving Novice
15. august 2005 - 20:46 #13
Baglæns:

function fjern1000Sep(num){
  return num.replace(/\./g,"").replace(/,/,".");
}

-- els velbekomme '-)

Iøvrigt er 200 point voldsomt mange, så behold selv nogle af dem !-)
Avatar billede mickiii Nybegynder
15. august 2005 - 21:00 #14
Nej du har sq fortjent dem alle. Det er en funktion jeg kommer til at bruger rigtigt meget, så du har hjulpet mere end du aner.
Avatar billede roenving Novice
15. august 2005 - 21:03 #15
Jamen, så tak for point ;~}
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