This template is for creating interactive calculators. It requires the calculator gadget. The calculator works by default. You can opt out at: Preferences > Gadgets > Template Gadgets > Enables javascript Calculator template. All pages using this system are added to Category:Pages using gadget Calculator.
You can use this template multiple times on a page to make input widgets, with some of the widgets using also the results of other widgets, like a spreadsheet cell that does a computation based on results of computations in other cells.
You can use {{Calculator label}} to mark text as a label for a calculator widget.
Statistics for this template are available at graphite
Here is a simple example to multiply two numbers. We invoke two calculator templates with no formula that act as input fields. We then invoke a third instance which has a formula for multiplying the other two cells. Note that formulas only take affect after the user interacts, so all cells need a default to use as initial value before user interaction.
{{calculator|id=a|default=2|size=4}} × {{calculator|id=b|default=2|size=4}} = {{calculator|id=c|formula=a*b|default=4|type=plain}}
produces:
2 × 2 = 4
{{calculator|id=km|type=number|size=9|default=1.609344|formula=miles*1.609344}} km = {{calculator|id=miles|type=number|size=9|default=1|formula=km/1.609344}} miles
produces:
1.609344 km = 1 miles
You can put widgets inside a wikitable.
{| class="wikitable" style = "float: left; margin-left:15px;"
|+ Metric
|-
| {{calculator label|Weight|for=weightkg}} || {{calculator|id=weightkg|size=3|default=80}} kg
|-
| {{calculator label|Height|for=heightcm}} || {{calculator|id=heightcm|size=3|default=160}} cm
|-
| BMI || '''{{calculator|id=bmimetric|type=plain|formula=round(weightkg/pow(heightcm/100,2))|default=31|style=min-width:3ch;display:inline-block}} kg/m<sup>2</sup>'''
|}
Weight | 80 kg |
Height | 160 cm |
BMI | 31 kg/m2 |
You can also put widgets inside an HTML table.
<table class="wikitable">
<tr><td>Imperial</td></tr>
<tr><td>Weight</td><td>{{calculator|id=weight|size=3}} lbs</td></tr>
<tr><td>Height</td><td>{{calculator|id=heightFeet|size=1}} feet {{calculator|id=heightInches|size=2}} inches</td></tr>
<tr><td>BMI</td><td>'''{{calculator|id=bmi|type=plain|formula=round(100*weight*703/pow(heightFeet*12+heightInches,2))/100}} kg/m<sup>2</sup>'''</td></tr>
</table>
Imperial | |
Weight | lbs |
Height | feet inches |
BMI | kg/m2 |
When pressed, the {{calculator button}} updates a form field.
{{calculator button|contents=Click me!|for=buttoncount|formula=buttoncount+1|type=default}} The button has been clicked {{calculator|type=plain|default=0|id=buttoncount}} times.
The button has been clicked 0 times.
A {{calculator label}}
{{calculator|type=checkbox|id=checklabelex}} {{calculator label|label=Please click this label|for=checklabelex}}
Please click this label
Formulas use normal math syntax, with english words representing other input boxes. e.g. sin(1+foo*2) would multiply the foo box by 2, add 1 and take the sine of the whole thing. All calculations are done using IEEE 754 double precision floating point numbers.
Keep in mind that the formula is recalculated only when the user interacts with the calculator. Prior to any user interaction, the "default" parameter to the calculator template is shown even if it is different from what the formula would give initially. Thus you should set the default parameter to what you expect the result of computing the formula will be.
Operators supported include: +, -, *, ×, /, ÷, % (percent is the modulo operator). Exponentiation must use the pow() function.
Math functions supported include: 'abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'cos', 'cosh', 'exp', 'floor', 'hypot', 'log', 'log10', 'log2', 'max', 'min', 'pow', 'random', 'sign', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc', 'clz32'
These have the same definition as in javascript. In particular, that means that log() is log base-e. The exception is round, for which we use our own definition.
The following additional functions are supported which are not from javascript Math library:
index( foo, 2+3 )
is the same as foo5
. The first argument must be an identifier (Nested index() is not allowed). The second argument must evaluate to an integer greater than or equal to 0. If either of these two arguments are invalid, NaN is returned. The third argument is returned if the arguments are valid but the result references a variable that does not exist. If unspecified the third argument defaults to NaN.switch(foo,2,10,4,20,5,30,7,80,-1)
returns 30.Numbers can be
If the calculator widgets are contained within an element with the class calculator-container
, then the ids are scoped to this element. This allows you to use the same ids multiple times on the same page without them interfering with each other. If the scoping element has the attribute data-calculator-refresh-on-load="true"
, then the calculator widgets are refreshed on first page load before the user interacts with it. Please note that labels are not affected by scoping and will likely go to whatever the next element in the document is with the correct id.
For example:
<div class="calculator-container" data-calculator-refresh-on-load="true">
{{calculator label|scopedfield:}} {{calculator|type=text|id=scopedfield|default=3.14}}<br>
This formula is updated before user interaction: {{calculator|type=plain|formula=scopedfield|default=No value}}
</div>
This formula is not updated because it is in a different scope: {{calculator|type=plain|formula=scopedfield|default=No value}}
Produces the following:
scopedfield: 3.14
This formula is updated before user interaction: No value
This formula is not updated even after user interaction because it is in a different scope: No value
Instead of using the css classes directly, you can also use the {{Calculator ifenabled}} with the scoped parameter.
Calculator formulas only work with numbers. However you can use mappings to convert numbers into text when they enter or leave the system. This allows for a very limited form of text input and output.
A mapping is a JSON object linking text strings to numbers. If the user inputs a specific (case-sensitive but whitespace trimmed) string on the list, it gets converted to the specified number. If a number is being outputted, it is checked to see if that number is in the mapping.
Mappings only work for text, plain and select. The values in the mapping object must have a JSON number type, except for the special values "default", "NaN", "Infinity" and "-Infinity" which must be strings. Mapping values are plain text - no wikitext formatting is allowed.
For example:
{{calculator label|
label=What is your favourite Encyclopedia?
|for=encyc
}}
{{calculator
|id=encyc
|type=text
|mapping={
"Wikipedia": 1,
"WikiPedia": 1,
"wikipedia": 1,
"Encyclopædia Britannica": 2,
"Encyclopaedia Britannica": 2,
"Britannica": 2,
"britannica": 2,
"Encarta": 3,
"encarta": 3,
"Nupedia": 4,
"nupedia": 4
}
}}
{{calculator
|formula=encyc
|type=plain
|mapping={
"I haven't heard of that": "default",
"I love Wikipedia too!": 1,
"I guess it is ok": 2,
"I wish I kept my CD.": 3,
"rip": 4
}
}}
Makes:
What is your favourite Encyclopedia?
You can use CSS to adjust the display, either via TemplateStyles or inline styles.
data-calculator-field-value
attribute. e.g. #calculator-field-fieldidhere[calculator-field-scopedfield^="3."] would select the field if it is >= 3.0 and < 4.0.Some examples:
Adjust color of border: 30
It is possible to make widgets be in MediaWiki (Codex) style instead of OS style. You can use most codex widgets that have a CSS-only version. See https://doc.wikimedia.org/codex/latest/components/demos/
Many codex style widgets have separate templates. When making a label, the {{Calculator label}} template has a parameter to output a codex style label
Template | Example |
---|---|
{{Calculator codex text}} | Label textShort description text
42
|
{{Calculator codex radio}} | This is a group of options
First optionAdditional text describing the first option Second optionAdditional text describing the first option Third option |
{{Calculator codex checkbox}} | First optionAdditional text describing the first option |
{{Calculator codex toggle}} | My toggleAdditional text describing the toggle
|
{{calculator|type=select|class=cdx-select}} | |
{{Calculator button}} |
|
See the individual template doc pages for all the options.
Users who do not have the gadget enabled in their preferences or have JS disabled, will not see the input boxes. Instead they will just see the default value for each box. With a good choice of default, this can be sufficient.
For example, if you have '''sin({{calculator|id=sine|type=text|default=0.5|size=4}}π)={{calculator|type=plain|default=1.00|decimals=2|formula=sin(sine*π)|id=sineres}}'''
to make sin(0.5π)=1.00, the non-js user will lose the interactivity, but they will still see the equation.
If you want more sophisticated fallbacks, you can use the calculatorgadget-enabled
and calculatorgadget-fallback
CSS classes.
<div class="calculatorgadget-enabled" style="display:none">This text is only shown if the gadget is enabled. {{calculator|type=text|size=20|default=100|id=xyz}} </div>
<div class="calculatorgadget-fallback">This text is only shown if the gadget is disabled</div>
Which produces:
Alternatively, you can use the {{Calculator ifenabled}} template to do this.
When using this template you should always be sure it still looks good even if the gadget is unavailable. You should test what the page looks like under print preview, as well as with ?safemode=1 appended to the url (Which is similar to what someone using the mobile app would see). You can use http://bawolff.net/wiki-nojs.htm to test what a page looks like with no javascript at all.
Calculator templates have a lot of power, which means the template author has more responsibility to create good templates.
The calculator template cannot be displayed for everyone. People without javascript or people using a screen reader will likely get a very different experience. You should aim to have equivalent content, or failing that, graceful degradation, for such users. You can use {{calculator ifenabled}} to help with this. Generally most calculator fields will show their default value if no javascript is enabled.
role
and aria-live
parameters. This can tell screen readers whether to read out content that has recently changed. Most calculator templates default to an aria-live value of polite
(type=passthru defaults to no aria-live), but you can override this. If you are showing something to the user a little at a time, use role=log to tell the screen reader that new content is expected to come. Be sure to set aria-live=off if you use calculator to display some data that is unimportant and should not be read out automatically on change. See mdn for more infocheckbox | 1 Wet | |
0 Big | ||
hidden | Not visible, does not take space. Useful for intermediate results in formulas. | |
number | 80 | |
passthru | Is not visibly changed but the css class changes based on the formula This does nothing by itself but can be combined with templatestyles, see {{calculator-hideifzero}} for an example. | |
plain | 2 | |
radio | 1 Metric | |
0 Imperial
See also: Calculator_label. | ||
text | 160 | |
range | 160 160 | |
select |
radiogroup()
function.default
parameter.{ "item1": 1, "item3": 3, "invalid": "NaN", "Group of options": { "suboptiona": 1.1 } }
{ "item1": 1, "item3": 3, "invalid": "NaN", "fallback string": "default" }
Add a calculator widget to the page. Like a spreadsheet you can refer to other widgets in the same page.
Parameter | Description | Type | Status | |
---|---|---|---|---|
id | id | The id for this input. This is used to reference it in formula of other calculator templates | String | required |
type | type | What type of input box
| String | required |
formula | formula | Formula to calculate this field
| String | suggested |
class | class | CSS classes to add | String | optional |
class-live | class-live | CSS class to add only if gadget is active on the page | String | optional |
decimals | decimals | Format to a fixed number of decimal digits [Only applies to type=number or type=plain]
| Number | optional |
default | default | Default value for this field | String | suggested |
exponential-precision | exponential-precision | Format to this many significant digits, using scientific notation [Only applies to type=number or type=plain]
| Number | optional |
max | max | max number allowed (type=number inputs only) | Number | optional |
min | min | min number allowed (type=number inputs only) | Number | optional |
name | name | For type=radio what group to assign the radio button to | Unknown | optional |
NaN-text | NaN-text | Use this text instead of NaN to signify "not a number". Only applies to format=plain or format=text. Plaintext only; wikitext is not supported
| String | optional |
placeholder | placeholder | Text to put as a placeholder in empty input | String | optional |
precision | precision | Format to this many significant digits, using decimal notation except for really large numbers [Only applies to type=number or type=plain]
| Number | optional |
readonly | readonly | Make input box readonly to user input | Boolean | optional |
size | size | Size of input box (How many characters it will fit) | Number | optional |
step | step | How much to increment a type=number input box
| Number | optional |
style | style | CSS to style the input element with | String | optional |
aria-describedby | aria-describedby | id of an element that is describing this widget (but is not its label). Used by accessibility software. | String | optional |
aria-labelledby | aria-labelledby | id of attribute that is the label for this element. Normally you should use the {{calculator label}} template instead. | String | optional |
aria-label | aria-label | label for this calculator widget for accessibility software. Normally you should use {{calculator label}} instead. | String | optional |
enterkeyhint | enterkeyhint | What should enter key be labelled as on the virtual keyboard on mobile phones
| String | optional |
inputmode | inputmode | What type of virtual keyboard to use on mobile phones. Recommended values include text (normal keyboard) decimal (positive number) numeric (number). Other supported values include none (Do not show a keyboard), tel, search, email and url
| String | optional |
mapping | mapping | A JSON object mapping strings to numbers to alter the display. Only works with type of plain, select or text. The values must be of type number, except for the strings "Infinity" "-Infinity", "default", and "NaN". For select type, can be two layers deep.
| String | optional |
role | role | Aria role. This helps a screen reader understand how to understand the content. For example, role=alert means that it is an urgent alert that should be read out right away. role=marquee means something that changes often and should not be read out by the screen reader. role=log means something where there is new content that gets added to the end which should be told to the user. role=status means it is a status update that should be read out when it changes. Will only be applied if gadget is enabled. If using a role that has an implicit aria-live value (alert, marquee, log, status) you should set aria-live=inherit to prevent the default aria-live from overriding. | String | optional |
aria-atomic | aria-atomic | If content changes, screen readers should read out the entire thing, not just the part that changed
| Unknown | optional |
aria-relevant | aria-relevant | What type of content changes should be read out by screen readers | Unknown | optional |
aria-live | aria-live | Value for aria-live. This controls if the screen reader should read out changes even when the user is focused elsewhere. Note the default for most calculator widgets is "polite". Set to "inherit" to set no aria-live attribute.
| Unknown | optional |
value | value | For field types of radio, checkbox and select. Allow setting the default value for a form, including in cases where the field isn't checked by default. Unlike default this won't be shown as a fallback for users without javascript. Note: for radiobuttons and checkboxes the value of the form control will be the result of the formula if set by a formula, but this value if checked by a human. | String | optional |
checked | checked | Should the radio button or checkbox start off in checked state. Overrides default. Unlike default this won't affect fallback text for non-js users. | String | optional |