Help:Switch parser function

The switch parser function, coded as "#switch", selects the first matching branch in a list of choices, acting as a case statement.

Each branch can be a value, an expression (calculation), or a template call,[1] evaluated and compared to match the value of the switch. Although many #switch structures are used to branch among a simple set of values, the branches can also include boolean expressions to act as a set of pre-conditions to be tested until one tests true, acting as an if-elseif-elseif-elseif-else structure. The switch value is compared as a character string, not a number, so "5" would not match "5.00" unless compared as "{{#expr:{{{1|5.00}}} }}" (="5").

A #switch can contain over 1,000 branches, but for better speed should be split to have less than 100 branches, in each of multiple or nested parts. The upper branches execute faster, and the bottom branches must wait for comparisons of all higher branches. Because it is a parser function, a #switch can be used inside any page, even in article text, but in most cases, a #switch is typically used inside a template, to branch depending on a parameter value passed to the template.

General formatedit

The #switch function can be a one-line form:

{{#switch: {{{x}}} |1=one |2=two |3|4|5=range 3–5 |other}}

That one-line #switch would read the value of {{{x}}}. For a value of 1 it would return "one". For a value of 2 it would return "two". For the values 3, 4 or 5 it would return "range 3–5". For any other value, or a null value, it would return "other".

However, in many cases, the #switch function is a multi-line form, with each branch on a different line, as follows:

{{#switch: {{{x}}} | 1 = one | 2 = two | #default = other | 3|4|5 = any of 3–5 | {{#expr: 2*3}} = six | {{#expr: 2*3+1}} = {{lc:SEVEN}} <!--lowercase-->}}

This illustrates an alternative method of specifying the default case, which can appear first, last, or anywhere in between.

If no default is specified and no case matches the supplied value, a null value is returned.

For each branch of a #switch, either side of an equals-sign "=" can be a simple value, an expression, or a template call.

Using switches as if-elseif-elseifedit

A #switch function can be structured as a set of pre-conditions which are tested until one is true (equal to "1"). For example to pre-screen numbers to avoid division by zero, in formula: x/x2 + y/y2

{{#switch: 1| {{#ifeq:{{{x2|none}}}|none|1|0}} = Parameter x2 has no data.| {{#ifeq:{{{y2|none}}}|none|1|0}} = Parameter y2 has no data.| {{#expr: {{{x2}}} = 0}} = Parameter x2 is 0 – cannot divide.| {{#expr: {{{y2}}} = 0}} = Parameter y2 is 0 – cannot divide.| 1 = {{#expr: {{{x}}}/{{{x2}}} + {{{y}}}/{{{y2}}}}}}}

When testing x2 and y2, if either of them is zero (none), then the #switch ends with a warning message, rather than calculating the weighted average of the two amounts x, y, with x2 and y2. Each branch acts as a pre-condition, so the whole #switch structure performs as equivalent to if-elseif-elseif-elseif-else, even though an #if-function structure cannot have an "elseif" clause. Note the 2 types of data compared:

Alphabetic data
An alpha character string can be compared in the #switch by using #ifeq: as follows:     {{#ifeq:{{{x2|none}}}|none|1|0}},
where the result would be "1" when true, or "0" when false.
Numeric data
Some numbers can be compared in the #switch by using #expr: as follows:     {{#expr: {{{y2}}} = 0}} or {{#expr: {{{x}}} < 41500}},
where each result would be "1" when true, or "0" when false.

Another example, to test an amount "n" to determine the number of decimal digits:

{{#switch: 1| {{#expr: floor({{{n}}}*100) <> {{{n}}}*100}} = 3| {{#expr: floor({{{n}}}*10) <> {{{n}}}*10}} = 2| {{#expr: floor( {{{n}}} ) <> {{{n}}} }} = 1| {{#expr: {{{n}}} mod 1000 = 0}} = −3| {{#expr: {{{n}}} mod 100 = 0 }} = −2| {{#expr: {{{n}}} mod 10 = 0 }} = −1| 1 = 0}}

That is another example, using "#switch: 1" to stack a set of pre-conditions which are tested, in sequence, until one is true (equal to "1").

Performance considerationsedit

Templates using such convoluted switch statements as to suffer significant performance issues should be translated to Lua, if that will make them simpler or significantly faster. The below discussion should rarely be relevant but is preserved for reference.

A #switch can contain over 1,000–2,000 branches, but should be split to have less than 100 branches, in multiple or nested parts. In some cases, it might be possible to split into multiple #switch structures, such as when many cases use the same first letter. Then, using {{padleft:|1|{{{value}}} }} can extract the first letter of {{{value}}} to be used in a higher #switch which branches by most-frequent letter, followed by all others at the bottom or "#default" branch. Another common split might be to separate numeric values into frequent ranges, followed by all other.

The upper branches of a #switch execute faster, and the bottom branches must wait for comparisons of all higher branches. Hence, the top branch should be the most-used case, unless pre-screening of data is done in the early branches.

Notesedit

  1. ^ A template call (also known as template tag) has two "braces" on either side of the template page name and does not require the "Template:" prefix. For example, the following are equivalent template calls: {{Template:Foobar}} and {{Foobar}}.

See alsoedit

🔥 Top keywords: Akademia e Shkencave e RPS te ShqiperiseAlexandria Ocasio-CortezBilderberg GroupCristiano RonaldoDong XiaowanMinecraftOperation GladioPrimal cutRiot FestStrictly Come Dancing (series 7)Main PageSpecial:SearchBaike: Requested articles/Business and economics/Companies/M-SIndian Premier LeagueFrancis Scott Key Bridge (Baltimore)Baike: Featured pictures2024 Indian Premier LeagueFrancis Scott Key Bridge collapseSean CombsNicole Shanahan3 Body Problem (TV series)PornhubJoe LiebermanThe Three-Body Problem (novel)XXXTentacionCleopatraYouTubeDan SchneiderDeaths in 2024MV DaliGodzilla x Kong: The New EmpireBrian PeckPorno y heladoSunrisers HyderabadUEFA Euro 2024Shōgun (2024 miniseries)Road House (2024 film)InstagramRonna McDanielDrake BellRobert F. Kennedy Jr.Francis Scott KeyAmanda BynesViral videoRobert HanssenBaltimoreBrandon ScottDune: Part TwoADX FlorenceFacebookTartanAditi Rao HydariSoaking (sexual practice)Ruby FrankeX-Men '97Cassie VenturaSunshine Skyway BridgeSergey Brin2024 Indian general electionList of Twenty20 cricket recordsSiddharth (actor)Portal Current eventsWinnie-the-Pooh: Blood and Honey 2Kalanithi MaranThree-body problemThe Gentlemen (2024 TV series)Kim PorterChatGPTJake GyllenhaalGhostbusters: Frozen EmpireWrestleMania XLKwena MaphakaPoor Things (film)2026 FIFA World Cup qualification (AFC)Dune (2021 film)United StatesWes MooreEndrick (footballer, born 2006)Maundy ThursdaySydney SweeneySolar eclipse of April 8, 2024Carol BurnettCrocus City Hall attackMadelyne PryorQuiet on Set: The Dark Side of Kids TVElin NordegrenKung Fu Panda 4SexCowboy CarterRed Eye (2005 American film)Battle of the HydaspesRyan GoslingFighter (2024 film)Eva MendesBattle of New CarthageImmaculate (2024 film)J. Robert OppenheimerArgentina national football teamShirley ChisholmTaylor SwiftLate Night with the DevilList of Indian Premier League records and statisticsRichard SerraTheo JamesNational September 11 Memorial & MuseumConor McGregorOppenheimer (film)Daniel KahnemanUEFA Euro 2024 qualifying