Manual:Expr parser function syntax/sl
Razširitev MediaWiki ParserFunctions omogoča uporabnikom preprosto matematično izračunavanje.
Funkcija expr razčleni matematične izraze in tudi logične (boolean) izraze s števili in booleani (z nizi ne). Skladnja je:
- {{ #expr: izraz }}
Presledki niso nujni. Znotraj števil presledki niso dovoljeni.
Podprti operatorji (približno po vrstnem redu prednosti) so not, *, /, div, mod, +, -, round, =, <>, !=, <=, >=, and in or.
Operatorji
[edit]Operator | Operacija | Zgled |
---|---|---|
none | {{#expr: 123456789012345|= }} ⇒ 1.2345678901234E+14{{ #expr: 0.000001|= }} ⇒ 1.0E-6
| |
+ | Unarni znak + | {{#expr: +30 * +7|= }} ⇒ 210
|
- | Unarni znak - (negacija) | {{#expr: -30 * -7|= }} ⇒ 210
|
not | Unarni NOT, logični NOT | {{#expr: not 0 * 7|= }} ⇒ 7{{ #expr: not 30 +7|= }} ⇒ 7
|
* | Množenje | {{#expr: 30*7|= }} ⇒ 210
|
/ | Deljenje, enako kot div | {{#expr: 30/7|= }} ⇒ 4.2857142857143
|
div | Deljenje, enako kot /, ne omogoča deljenja celih števil |
{{#expr: 30 div 7|= }} ⇒ 4.2857142857143 (moralo bi biti 4){{ #expr: 5 div 2 * 2 + 5 mod 2|= }} ⇒ 6 (moralo bi biti 5)
|
mod | »Modulo«, ostanek po celoštevilčnem deljenju. Pozor, div in mod sta drugačna kot pri programskih jezikih. To je bilo popravljeno, vendar še ni v uporabi. Glej bugzilla:6068. |
{{#expr: 30 mod 7|= }} ⇒ 2{{ #expr: -8 mod -3|= }} ⇒ -2{{ #expr: -8 mod +3|= }} ⇒ -2{{ #expr: 8 mod 2.7|= }} ⇒ 0 (moralo bi biti 2.6){{ #expr: 8 mod 3.2|= }} ⇒ 2 (moralo bi biti 1.6){{ #expr: 8.9 mod 3|= }} ⇒ 2 (moralo bi biti 2.9)
|
+ | Seštevanje | {{#expr: 30+7|= }} ⇒ 37
|
- | Odštevanje | {{#expr: 30-7|= }} ⇒ 23
|
round | Zaokroži število na levi na potenco 1/10, vpisano na desni | {{#expr: 30/7 round 3|= }} ⇒ 4.286{{ #expr: 30/7 round 0|= }} ⇒ 4{{ #expr: 3456 round -2 }} = 3500
|
= | Enako (numerično in logično) | {{#expr: 30 = 7|= }} ⇒ 0
|
<> | Neenako, enako kot != | {{#expr: 30 <> 7|= }} ⇒ 1
|
!= | Neenako, enako kot <>, logični xor | {{#expr: 1 != 0|= }} ⇒ 1
|
< | Manjše kot | {{#expr: 30 < 7|= }} ⇒ 0
|
> | Večje kot | {{#expr: 30 > 7|= }} ⇒ 1
|
<= | Manjše ali enako | {{#expr: 30 <= 7|= }} ⇒ 0
|
>= | Večje ali enako | {{#expr: 30 >= 7|= }} ⇒ 1
|
and | Logični AND | {{#expr: 4<5 and 4 mod 2|= }} ⇒ 0
|
or | Logični OR | {{#expr: 4<5 or 4 mod 2|= }} ⇒ 1
|
Booleanovi operatorji obravnavajo 0 kot vrednost false (neresnično), vsa druga števila pa kot true (resnično). Vmesni ali končni rezultat true je enak 1. Zgled: {{#expr: (2 < 3) + 1|=
}} ⇒ 2.
Prednost:
- {{
#expr: 2 - 3 + 4 / 5 * 6|=
}} ⇒ 3.8
(+ in - sta si po prednosti enakovredna, prav tako * in /, ki imata prednost pred prvima dvema).
- {{
#expr: 2 = 5 < 3 + 4|=
}} ⇒ 1
(najprej +, nato =, nato <).
- {{
#expr:1.234 + 1.234 round 1 + 1
}} ⇒ 2.47
(najprej sešteje, nato zaokroži)
- {{
#expr:3 * 4 mod 10 * 10
}} ⇒ 20
(mod in množenje sta si po prednosti enakovredna, razčlemba poteka z leve na desno)
Prednosti lahko spremenite z oklepaji: {{#expr: (2 + 3) * 4|=
}} ⇒ 20
Presledki povečajo berljivost, za pravilno delovanje pa niso nujni, razen med not in sosednjim operatorjem and/div/mod/not/or/round, in med števili niso dovoljeni:
- {{
#expr:7mod3
}} ⇒ 1 - {{
#expr:7.5round0
}} ⇒ 8 - {{
#expr:0and1
}} ⇒ 0 - {{
#expr:0or not0
}} ⇒ 1 - {{
#expr:0ornot0
}} ⇒ Expression error: Unrecognized word "ornot". - {{
#expr:123 456
}} ⇒ Expression error: Unexpected number. - {{
#expr:not not3
}} ⇒ 1 - {{
#expr:notnot3
}} ⇒ Expression error: Unrecognized word "notnot".
- {{
#expr:---2
}} ⇒ -2 - {{
#expr:-+-2
}} ⇒ 2 - {{
#expr:2*-3
}} ⇒ -6 - {{
#expr:-not-not-not0
}} ⇒ -1 - {{
#expr:2*/3
}} ⇒ Expression error: Unexpected / operator.
Številke kot vnos
[edit]Vodilne ničle in sledeča decimalna vejica (za celo število), kot tudi sledeči ničle v številki z decimalno vejico, so dovoljeni.
- {{
#expr: +01.20
}} ⇒ 1.2 - {{
#expr: 12.
}} ⇒ 12
Te enakovrednosti veljajo tudi za #ifeq in #switch, opisana spodaj.
Znanstvena notacija in operatorji grupiranja v vnosu za izraze niso sprejeti:
- {{
#expr: 2E-05
}} ⇒ 2.0E-5. - Template:Evdn.
- {{
#expr: 123,456
}} ⇒ Expression error: Unrecognized punctuation character ",".
Z določevalcem R (»raw«) vrnejo {{NUMBEROFARTICLES:R
}} = 63632 itd. številke brez separatorjev, kar lahko uporabimo pri izračunavanju.
Števila kot izložek
[edit]Neceloštevilčni rezultat vsebuje decimalno vejico (ali piko, odvisno od krajevne prilagoditve). Števila z absolutno vrednostjo pod 1E-4 in z absolutno vrednostjo enako ali nad 1E+12 so zapisana z znanstveno notacijo. Dobljena števila tako vključujejo:
- {{
#expr: -1234567890*10|=
}} ⇒ -12345678900 - {{
#expr: +1234567890*100|=
}} ⇒ 123456789000 - {{
#expr: -1234567890*1000|=
}} ⇒ -1234567890000 - {{
#expr: +1234567890*10000|=
}} ⇒ 12345678900000 - {{
#expr: -0.1234567890/100|=
}} ⇒ -0.00123456789 - {{
#expr: +0.1234567890/1000|=
}} ⇒ 0.000123456789 - {{
#expr: -0.1234567890/10000|=
}} ⇒ -1.23456789E-5 - {{
#expr: +0.1234567890/100000|=
}} ⇒ 1.23456789E-6
Ker znanstvena notacija kot vnos ni sprejeta, lahko je lahko uporaba z gnezdenjem v primerih, kjer isto sestavljeno računanje z #expr deluje, neuspešna.
- Tako:
- {{
#expr: 1/10000 *2|=
}} ⇒ 0.0002, - Template:Evdn,
- {{
#expr: 1/100000 *2|=
}} ⇒ 2.0E-5, vendar - Template:Evdn.
- Enake težave se lahko pojavijo pri uporabi dolgih časovnih žigov YYYYMMDDhhmmss:
- {{
CURRENTTIMESTAMP
}} ⇒ 20241121111211, - Template:Evdn.
- Časovni žigi brez sekund imajo 12 števk, kar je ravno zadosti kratko:
- {{
#expr:20241121111211/100
}} ⇒ 202411211112.11
Za pridobitev izložka velikih celih števil v ne-znanstveni notaciji, primerni za vnos v drug račun, glej Template:Tim-sl. Za števila z vejicami kot separatorji grupiranja glej Template:Tim-sl.
Kadar je rezultat zaokroževanja negativnega števila negativen, je rezultat "-0". Temu se izognete tako, da izraz x zamenjate z 0 + ( x ):
- {{
#expr: ( -0.2 round 0 )|=
}} ⇒ -0 - {{
#expr: 1*(-0.2 round 0)|=
}} ⇒ -0 - {{
#expr: 0+(-0.2 round 0)|=
}} ⇒ 0
Točnost
[edit]Točnost rezultata #expr je manjša od točnosti, ki se uporablja interno v izračunavanju izraza:
- {{
#expr:(2/3)
}} ⇒ 0.66666666666667 - {{
#expr:(2/3)*1000000-666666
}} ⇒ 0.66666666662786 - Template:Evdn
- {{
#expr:1234567890.1234567890-1234567890
}} ⇒ 0.12345671653748 (zaključek: uporabljenih je 16 ali 17 števk številke 1234567890.1234567890) - {{
#expr:1234567890.1234567890
}} ⇒ 1234567890.1235 (rezultat je zaokrožen na vsega 12 števk) - Template:Evdn
- Strojna natančnost ali najmanjši x, pri katerem je 1+x != 1 blizu 0.5^53 + 0.5^106 ali 1.1102230246251566636831481088739149080825883E-16 (glej zgoraj):
- {{
#expr:1=1+0.00000000000000011102230246251566636831481088739149080826|=
}} ⇒ 0 - {{
#expr:1=1+0.00000000000000011102230246251566636831481088739149080825|=
}} ⇒ 1
- To je za 64=1+52+11 bitov (52 mantissa, 11 eksponent) normalno. Kot razloženo, to ni povezano z najmanjšim rezultatom izraza, večjim od 1:
- {{
#expr:1+0.000000000004999889392|=
}} ⇒ 1.000000000005 - {{
#expr:1+0.000000000004999889391|=
}} ⇒ 1.000000000005 pod okrog 1 + 5E-12.
Razvejevanje glede na izraz
[edit]Funkcija #ifexpr da enega od dveh določenih rezultatov, kar je odvisno od vrednosti booleanovega izraza s števili in booleani (ne pa nizi). Zgled:
- {{#ifexpr: {{CURRENTDOW}} = 0 or {{CURRENTDOW}} = 6 | weekend | Mo-Fr}} yields Pon-Pet, ker je danes Thursday z {{
CURRENTDOW
}} = 4.
Primerjave
[edit]- Enakovrednost števil in nizov lahko ugotavljate s funkcijo #ifeq:.
- Posamezen niz lahko z več drugimi primerjate s funkcijo #switch:, ki vrne ustreznega od več določenih rezultatov.
- {{
#switch:FR|UK=London|FR=Pariz|NL=Amsterdam
}} ⇒ NL=Amsterdam - {{
#switch:UK|UK|GB=London|FR=Pariz
}} ⇒ FR=Pariz - {{
#switch:ZZ|UK=London|FR=Paris|nima para
}} ⇒ nima para
- {{
#ifeq:3|3.0|1|0
}} ⇒ 1 - {{
#ifeq:3|03|1|0
}} ⇒ 1 - {{
#ifeq:0.00003456|3.456E-05|1|0
}} ⇒ 1- Vedite, da (v nasprotju z #expr:) #ifeq: kot vnos sprejema tudi eksponencialno notacijo.
- {{
#ifeq:1234567890123|1234567890120|1|0
}} ⇒ 0 - {{
#ifeq:1234567890123|1.23456789012E+12|1|0
}} ⇒ 0 - {{
#ifeq:1234567890120|1.23456789012E+12|1|0
}} ⇒ 1 - {{
#ifeq:1.234567890120E12|1.23456789012E+12|1|0
}} ⇒ 1- Numerične primerjave niso odvisne od oblike izložka. Primerjaj:
- {{
#expr:1234567890123
}} ⇒ 1234567890123 - {{
#expr:1234567890120
}} ⇒ 1234567890120
#ifeq: omogoča primerjavo nizov z enačaji:
#switch: | rezultat | #ifeq: | rezultat |
---|---|---|---|
-1=dobro|odpovej}} | odpovej | -1|dobro|odpovej}} | dobro |
a=b=dobro|odpovej}} | odpovej | a=b|dobro|odpovej}} | dobro |
a=b=odpovej|dobro}} | dobro | a=b|odpovej|dobro}} | dobro |
Dolžina izraza
[edit]Iskanje absolutne vrednosti numeričnega izraza x, ne da bi uporabili še eno predlogo, vsaj podvoji dolžino izraza:
- x*(1-2*(x<0))
- x*{{#ifexpr:x>0|1|-1}}
(Prvi niz ni le krajši, temveč ima tudi to prednost, da je za substitucije potreben en »subst:« ali {{{subst|}}} manj.)
za dolge izraze ne uporabljajte
- {{#ifexpr:x>0|x|-x}},
saj potroji dolžino.
Podobno za zaokroževanje ali pretvarjanje ne uporabljajte mod, saj podvoji dolžino izraza.
Kdar je rezultat izraza pod 10, podvoji dolžino izraza tudi vodilna ničla:
- {{#ifexpr:x<10|0}}x
Ta »eksponencialna« rast izrazov z mnogo ponavljanja je posledica pomanjkanja spremenljivk (v smislu programiranja). Do neke mere lahko funkcionalnost spremenljivk dosežemo s predlogami (podrutinami), vendar pa je njihovo pridobivanje iz podatkovne zbirke lahko počasnejše kot razčlemba celo dolgega izraza.
Kadar je število mogočih rezultatov dolgega izraza majhno, omogoča pretvarjanje po želji , vključno z absolutno vrednostjo in izložkom vodilne ničle ipd., ne da bi se izraz ponovil, switch.
Sporočila o napaki
[edit]Izraz | Sporočilo o napaki |
{{#expr:1/0 }} | Division by zero. |
{{#expr:2* }} | Expression error: Missing operand for *. |
{{#expr:1 2 }} | Expression error: Unexpected number. |
{{#ifexpr:1*/2 }} | Expression error: Unexpected / operator. |
{{#expr: 1 (2) }} | Expression error: Unexpected ( operator. |
{{#expr: (1 }} | Expression error: Unclosed bracket. |
{{#expr: 1) }} | Expression error: Unexpected closing bracket. |
{{#expr:2*123,456 }} | Expression error: Unrecognized punctuation character ",". |
{{#expr:{{{a}}} }} | Expression error: Unrecognized punctuation character "{". |
{{#ifexpr:3%2 }} | Expression error: Unrecognized punctuation character "%". |
{{#ifexpr:abc }} | Expression error: Unrecognized word "abc". |
{{#expr:abc.def }} | Expression error: Unrecognized word "abc". |
{{ #expr:{{ x|102|1000*}} 18 }} da 1.8E+307 | |
{{ #expr:{{ x|102|1000*}} 179 }} gives 1.79E+308 | |
{{ #expr:{{ x|102|1000*}} 180 }} da INF | |
{{ #expr:{{ x|33|(1+(}} 1 {{ x|33|))}} }} da 34 | |
{{ #expr:{{ x|34|(1+(}} 1 {{ x|34|))}} }} da Expression error: Stack exhausted. | |
{{#expr:3.4.5.6 }} ⇒ 3.4 (nenamenska nenavadnost)
|
Opomba: dani niz, tukaj dele izraza, skopira, kakor je določeno (maksimalno 120-krat), predloga Template:Tim-sl. Ta stran v drugih projektih dejansko razčleni substituiran izložek kot 102 faktorja »1000« krat »180«, da dobimo INF (neskončnost).
Wikibesedilo brez sporočil o napaki funkcij razčlenjevalnika, vendar navadno z napako ob uporabi ali poskusu uporabe:
{{{#expr:2*3}}} | {{{#expr:2*3}}} | (trojni oklepaj, celota se tolmači kot oznaka parametra z imenom parametra "#expr:2*3") |
{{#expr:2*3}}} | 6} | (en zaklepaj preveč; zadnji izmed treh se tolmači kot golo besedilo, tako ostala koda deluje prav) |
{{{#expr:2*3}} | {6 | (en uklepaj preveč; prvi izmed treh se tolmači kot golo besedilo, tako ostala koda deluje prav) |
{{#expr:2*3} | {{#expr:2*3} | (premalo oklepajev, kot golo besedilo se tolmači vsa koda) |
- Nedodelano, vendar informativno sporočilo »neprepoznana beseda« lahko dosežemo namenoma. Prikazana je le prva prepoznana napaka:
- {{ #expr: 2*{{ #ifexpr: 3*4>10|preveliko|3*4 }} }} da
- Expression error: Unrecognized word "preveliko".,
- {{ #expr: 2*{{ #ifexpr: 3*4>10|preveč veliko|3*4 }} }} da
- Expression error: Unrecognized word "preve"..