alert

Status
Niet open voor verdere reacties.

Leon25

Gebruiker
Lid geworden
28 jun 2007
Berichten
420
Hallo een vraagje :

if (getal < 1) {
alert ("Remark : N = 1 of N > 1 ! De berekening is afgebroken. Klik op OK om te vervolgen.");
return;
}

wat inhoudt : als N kleiner is dan 1 wordt het rekenen afgebroken.

is het ook mogelijk om in deze voorwaarde in te bouwen dat het uitsluitend om gehele positieve getallen gaat ? Dus als iemand bijvoorbeeld 2.5 invoert dat dan ook het rekenen wordt afgebroken. Het is nogal omslachtig en vaag om het in te bouwen m.b.v. parseInt en Math.abs in een latere fase ( bijvoorbeeld var getal = Math.abs(parseInt(serie(document.xyz.xyzz.value))); ) .. Direct onderbreken bij de input is helder en duidelijk voor de bezoeker van de betreffende pagina. Maar misschien is het voor input ook mogelijk om met parseInt en Math.abs te werken ? Hoeft overigens niet perse, andere oplossing ook welkom..

Met dank voor antwoord :).
 
Laatst bewerkt:
In de gauwigheid dit in elkaar gezet.
HTML:
<html>
<head>
<script type="text/javascript">
function isafloat(input) {
  if(parseFloat(input) != parseInt(input)) {
    alert('FLOAT!');
  } else {
    alert('Not FLOAT!');
  }
}
</script>
</head>
<body>
<input type="text" onchange="isafloat(this.value);" />


</body>
</html>
Zo bedoel je?
 
Het kan efficiënter. Ookal maakt dat in dit geval misschien niet uit.

Code:
if (getal < 1)
{
  alert ("N moet minimaal 1 zijn! De berekening is afgebroken. Klik op OK om te vervolgen.");
  return;
}

if (getal % 1 != 0)
{
  alert ("N moet een geheel getal zijn! De berekening is afgebroken. Klik op OK om te vervolgen.");
  return;
}

getal % 1 betekent, deel het getal door 1 en geef de rest (ook wel bekend als modulus). Oftewel, als iets precies deelbaar is door 1 geeft het de uitkomst 0. Het scheelt waarschijnlijk niet veel, maar het is wel efficiënter dan twee keer een getal parsen.

Als je de code een miljoen keer draait in Firefox op mijn PC duurt parseFloat == parseInt 1825 milliseconden. getal % 1 == 0 een miljoen keer duurt 186 milliseconden. :p




Mocht je het zelf willen testen, dat kan :P . Verlaag het aantal wel als je het in IE wilt testen want daar duurt het zo lang dat ie vraagt het script te onderbreken (en dat verstoort de resultaten).
HTML:
<html>
<head></head>

<body>

<script>
//<![CDATA[

var start	= 0;
var getal	= 2.5;
var i		= 0;
var uitkomst	= false;

start = new Date().getTime();
for (i = 0; i < 1000000; i++)
{
  uitkomst = parseFloat(getal) == parseInt(getal);
}
document.write ("parseFloat == parseInt: " + (new Date().getTime() - start) + " milliseconden.<br />");


start = new Date().getTime();
for (i = 0; i < 1000000; i++)
{
  uitkomst = getal % 1 == 0;
}
document.write ("getal % 1 == 0": " + (new Date().getTime() - start) + " milliseconden.<br />");


//]]>
</script>
</body>
</html>
 
Laatst bewerkt:
Heb inderdaad ook aan modulo zitten denken maar bleef hangen dat het voor een even of oneven getal wordt gebruikt.

Nooit aan gedacht dat het natuurlijk ook zo kan worden gebruikt :D
 
Met dank voor de reacties ! Wat er vermeld is dat kan ik zeker gebruiken :thumb:.
Ook zie je maar weer eens dat er met JS meerdere wegen naar de oplossing leiden :).
Ik had deze nog ( nadat ik mijn vraag had gesteld alhier ) :

if(Math.abs(parseInt(getal)) != getal) {
alert("input een niet decimaal en positief getal !");
}

if (num < 1) {
alert ("Calculation has been cancelled. Click OK to continue.");
return;
}

Vanwege het afbreken ( blokkeren ) van de berekening heb je nu ook een net overzicht. Eerst had ik zelf een haakje te weinig geplaatst en verkreeg van iemand anders bovenstaand voorbeeld waardoor ik mijn eigen fout duidelijk kon zien. Slordigheid is uit den boze met een script.
 
Laatst bewerkt:
Math.abs is hier compleet nutteloos. Ik zie geen reden om de absolute waarde van het getal te nemen. :shocked:

Overigens wordt nu de functie niet gestopt na de eerste alert en in de tweede controleer je de variable "num" in plaats van "getal".

Ik heb het nog even door een efficiëntie test gegooid, ook als je math.abs eruit laat is "getal % 1 == 0" duidelijk de efficiëntste manier. Ongeveer vijf keer zo efficiënt.

Ik zou het dus zo schrijven. Het is belangrijk dat achter elke alert een return staat, anders gaat het script gewoon door ondanks dat de waarde niet geldig is.
Code:
if (getal < 1)
{
  alert ("N moet minimaal 1 zijn! De berekening is afgebroken. Klik op OK om te vervolgen.");
  return;
}

if (getal % 1 != 0)
{
  alert ("N moet een geheel getal zijn! De berekening is afgebroken. Klik op OK om te vervolgen.");
  return;
}

Het is misschien overdreven om zo erg naar efficiëntie te kijken bij iets wat maar één keer uitgevoerd wordt, maarja, wie weet ga je ooit de code hergebruiken in een loop die erg vaak uitgevoerd gaat worden. Dan is 5 keer zo efficiënt ineens wel belangrijk :p
 
Laatst bewerkt:
Inderdaad .. ik zie het ook :).

Excuus overigens voor de slordigheid in :
PHP:
if (num < 1) {
alert ("Calculation has been cancelled. Click OK to continue.");
return;
}
num moet daar zijn : getal. Dus :
PHP:
if (getal < 1) {
alert ("Calculation has been cancelled. Click OK to continue.");
return;
}
Het regeltje was bijgevoegd als experimenteerobject.
Math.abs in de eerste regel is hier inderdaad overbodig.
Bovendien :
PHP:
if(Math.abs(parseInt(getal)) != getal) {
alert("input een niet decimaal en positief getal !");
}
ontbreekt return; Dat had je goed gezien. Het moest er wel staan. Bij het overnemen is het eens goed misgegaan.
PHP:
if (parseInt(getal) != getal) {
alert("input een niet decimaal en positief getal !");
return;
}
Nogmaals mijn dank voor de tips. Wat je hier schrijft : "Als je de code een miljoen keer draait in Firefox op mijn PC duurt parseFloat == parseInt 1825 milliseconden. getal % 1 == 0 een miljoen keer duurt 186 milliseconden" is ook iets om rekening mee te houden trouwens.
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan