Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: JavaScript: Laskulauseke tekstilaatikossa

Sivun loppuun

Antti Laaksonen [08.06.2006 16:30:13]

#

Tämä JavaScript-ohjelma tunnistaa käyttäjän kirjoittamasta tekstistä laskulausekkeita ja laskee automaattisesti niiden arvon, jos laskulausekkeen jälkeen tulee yhtäsuuruusmerkki ja kysymysmerkki. Näin yksinkertaisiin laskuihin ei tarvitse laskinta esimerkiksi keskustelun viestiä kirjoittaessa.

Esimerkiksi käyttäjä kirjoittaa:
Vuodessa on 60 * 60 * 24 * 365 = ?

Samalla hetkellä teksti muuttuu muotoon:
Vuodessa on 60 * 60 * 24 * 365 = 31536000

Ja käyttäjä jatkaa näin:
Vuodessa on 60 * 60 * 24 * 365 = 31536000 sekuntia.

Laskulauseke lasketaan suoraan JavaScriptin eval-funktiolla, joten tarvittavan koodin pituus ei ole järin suuri. Ohjelma pyöristää tuloksen kuuden desimaalin tarkkuudelle. Käytössä on desimaalipiste amerikkalaiseen tapaan, mutta tarpeen tullen desimaalierottimen muutos ei ole vaikeaa.

Jostain syystä Operalla tekstikohdistin siirtyy häiritsevästi tekstin alkuun tekstin muuttuessa. Tietääkö kukaan, miten tämän voi korjata?

<script>

function lasku(teksti) {
    // laskutoimituksen merkit
    merkit = "0123456789.+-*/() ";
    // tekstin pituus
    pituus = teksti.value.length;

    // jos viimeiset merkit ovat "= ?"...
    if (teksti.value.substr(pituus - 3, 3) == "= ?") {
        alku = -1;

        // etsitään laskulausekkeen alku sallittujen merkkien avulla
        for (i = pituus - 4; i >= 0; i--) {
            if (merkit.indexOf(teksti.value.charAt(i)) != -1) {
                if (teksti.value.charAt(i) != " ") alku = i;
            } else {
                break;
            }
        }

        // jos sopiva laskulauseke löytyi...
        if (alku != -1) {
            // poimitaan laskulauseke tekstistä
            lauseke = teksti.value.substring(alku, pituus - 3);
            // lasketaan sen arvo eval-funktiolla
            try { lauseke = eval(lauseke); }
            catch (virhe) { return; }
            // pyöristetään kuuden desimaalin tarkkuudelle
            lauseke = (Math.round(lauseke * 1000000) / 1000000);
            // korvataan kysymysmerkki laskun tuloksella
            teksti.value = teksti.value.substr(0, pituus - 1) + lauseke;
        }
    }
}
</script>

<textarea cols="40" rows="8" onkeyup="lasku(this)"></textarea>

Meitsi [09.06.2006 16:07:06]

#

Kuulostaa kätevältä, vaikka testata en kerinnytkään :) Onko kenties Ohjelmointiputkaan tulossa tällainen uuden ulkoasun mukana?

Niko [09.06.2006 19:19:50]

#

javascript:function a(){teksti=document.getSelection();merkit="0123456789.+-*/() ";pituus=teksti.length;alku=-1;for(i=pituus-4;i>=0;i--)
{if(merkit.indexOf(teksti.charAt(i))!=-1){if(teksti.charAt(i)!=" "){alku=i;}}else{break;}}if(alku!=-1){lauseke=teksti;try{lauseke=eval(lauseke);}
catch(virhe){return;}lauseke=(Math.round(lauseke*1000000)/1000000);alert(lauseke);}};a();

Kirjanmerkki-versio eli maalat sivuilta lausekkeen ja painat niin saat vastauksen.

progo [12.06.2006 13:08:42]

#

Ja tulos on tyylikäs ilmoittaa <a title="tulos"> -tyyliin. Niin ei häiritse lukiessa. Eikä siis tarvi myöskään noita = ? -juttuja tunkea erikseen.

siirappi [14.06.2006 08:45:59]

#

Eikös tuon kohdistimen alkuun menemisen voi korjata jotenkin laittamalla selectionStart ja selectionEnd -arvot.

teksti.selectionStart = teksti.value.length;
teksti.selectionEnd = teksti.value.length;

arcatan [16.06.2006 16:37:22]

#

Ovela vinkki! Tälläinen voisi tosiaan olla integroituna Ohjelmointiputkaankin.

Juuso [22.06.2006 01:48:44]

#

Ja tämä on vieläpä sitä, missä JavaScriptistä voi oikeasti olla hyötyä!

Jorgga [22.06.2006 22:38:06]

#

lainaus:

Ovela vinkki! Tälläinen voisi tosiaan olla integroituna Ohjelmointiputkaankin.

olen samaa mieltä käyttöön myös ohjelmointiputkaan :D

moptim [20.05.2007 09:10:10]

#

Oikeasti JavaScriptistä on hyötyä, jos sillä tehdään 3D-räiskintä ;)

Short Php [08.12.2008 19:02:42]

#

moptim kirjoitti:

Oikeasti JavaScriptistä on hyötyä, jos sillä tehdään 3D-räiskintä ;)

-_- http://www.benjoffe.com/code/demos/canvascape/


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta