<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://skandinavien-wiki.net/w/index.php?action=history&amp;feed=atom&amp;title=Modul%3AFormatNum</id>
	<title>Modul:FormatNum - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://skandinavien-wiki.net/w/index.php?action=history&amp;feed=atom&amp;title=Modul%3AFormatNum"/>
	<link rel="alternate" type="text/html" href="https://skandinavien-wiki.net/w/index.php?title=Modul:FormatNum&amp;action=history"/>
	<updated>2026-05-05T03:00:21Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in skandinavien-wiki.net</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://skandinavien-wiki.net/w/index.php?title=Modul:FormatNum&amp;diff=8036&amp;oldid=prev</id>
		<title>Xineohp1506: 3 Versionen von :skanwiki:Modul:FormatNum importiert</title>
		<link rel="alternate" type="text/html" href="https://skandinavien-wiki.net/w/index.php?title=Modul:FormatNum&amp;diff=8036&amp;oldid=prev"/>
		<updated>2023-01-13T12:47:33Z</updated>

		<summary type="html">&lt;p&gt;3 Versionen von &lt;a href=&quot;/w/index.php?title=SkanWiki:Modul:FormatNum&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;SkanWiki:Modul:FormatNum (Seite nicht vorhanden)&quot; data-bs-title=&quot;SkanWiki:Modul:FormatNum&quot;&gt;skanwiki:Modul:FormatNum&lt;/a&gt; importiert&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 13. Januar 2023, 14:47 Uhr&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key d03bbfb2:diff::1.12:old-8035:rev-8036 --&gt;
&lt;/table&gt;</summary>
		<author><name>Xineohp1506</name></author>
	</entry>
	<entry>
		<id>https://skandinavien-wiki.net/w/index.php?title=Modul:FormatNum&amp;diff=8035&amp;oldid=prev</id>
		<title>Xineohp1506: 2 Versionen von :skanwiki:Modul:FormatNum importiert</title>
		<link rel="alternate" type="text/html" href="https://skandinavien-wiki.net/w/index.php?title=Modul:FormatNum&amp;diff=8035&amp;oldid=prev"/>
		<updated>2021-10-21T16:15:22Z</updated>

		<summary type="html">&lt;p&gt;2 Versionen von &lt;a href=&quot;/w/index.php?title=SkanWiki:Modul:FormatNum&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;SkanWiki:Modul:FormatNum (Seite nicht vorhanden)&quot; data-bs-title=&quot;SkanWiki:Modul:FormatNum&quot;&gt;skanwiki:Modul:FormatNum&lt;/a&gt; importiert&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. Oktober 2021, 18:15 Uhr&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key d03bbfb2:diff::1.12:old-8034:rev-8035 --&gt;
&lt;/table&gt;</summary>
		<author><name>Xineohp1506</name></author>
	</entry>
	<entry>
		<id>https://skandinavien-wiki.net/w/index.php?title=Modul:FormatNum&amp;diff=8034&amp;oldid=prev</id>
		<title>skanwiki&gt;Xineohp1506: 1 Version von :wikipedia:de:Modul:FormatNum importiert</title>
		<link rel="alternate" type="text/html" href="https://skandinavien-wiki.net/w/index.php?title=Modul:FormatNum&amp;diff=8034&amp;oldid=prev"/>
		<updated>2020-06-05T14:56:10Z</updated>

		<summary type="html">&lt;p&gt;1 Version von &lt;a href=&quot;https://de.wikipedia.org/wiki/de:Modul:FormatNum&quot; class=&quot;extiw&quot; title=&quot;wikipedia:de:Modul:FormatNum&quot;&gt;wikipedia:de:Modul:FormatNum&lt;/a&gt; importiert&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 5. Juni 2020, 16:56 Uhr&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key d03bbfb2:diff::1.12:old-8033:rev-8034 --&gt;
&lt;/table&gt;</summary>
		<author><name>skanwiki&gt;Xineohp1506</name></author>
	</entry>
	<entry>
		<id>https://skandinavien-wiki.net/w/index.php?title=Modul:FormatNum&amp;diff=8033&amp;oldid=prev</id>
		<title>wikipedia:de&gt;Antonsusi am 1. Oktober 2019 um 21:24 Uhr</title>
		<link rel="alternate" type="text/html" href="https://skandinavien-wiki.net/w/index.php?title=Modul:FormatNum&amp;diff=8033&amp;oldid=prev"/>
		<updated>2019-10-01T21:24:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local FormatNum = { suite  = &amp;quot;FormatNum&amp;quot;,&lt;br /&gt;
                    serial = &amp;quot;2018-05-07&amp;quot;,&lt;br /&gt;
                    item   = 15709679 };&lt;br /&gt;
--[[&lt;br /&gt;
FormatNum&lt;br /&gt;
* format&lt;br /&gt;
* minus&lt;br /&gt;
* padding&lt;br /&gt;
* roman2number&lt;br /&gt;
* round&lt;br /&gt;
* failsafe&lt;br /&gt;
FormatNum()&lt;br /&gt;
]]&lt;br /&gt;
local DEFAULT_FORMAT = &amp;quot;dewiki&amp;quot;;&lt;br /&gt;
local DEFAULT_METHOD = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Constant for round method &amp;quot;round half to even&amp;quot; (IEEE 754)&lt;br /&gt;
local ROUND_TO_EVEN = 0;&lt;br /&gt;
&lt;br /&gt;
-- Constant for round method &amp;quot;round half away from zero&amp;quot;&lt;br /&gt;
-- (German: &amp;quot;kaufmaennisches Runden&amp;quot;),&lt;br /&gt;
-- also filters &amp;quot;-0&amp;quot; and converts it to &amp;quot;0&amp;quot;.&lt;br /&gt;
local ROUND_AWAY_FROM_ZERO = 1;&lt;br /&gt;
&lt;br /&gt;
-- Constant for U+202F&lt;br /&gt;
local THIN_SPACE = mw.ustring.char( 8239 );&lt;br /&gt;
&lt;br /&gt;
-- Constant for reducing code range to ANSI&lt;br /&gt;
local SPACER_SPAN = &amp;quot;&amp;lt;span style=&amp;#039;display:inline-block;width:.167em;&amp;#039;&amp;gt;&amp;amp;#160;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
-- Constant for padding span element&lt;br /&gt;
local PADDING_SPAN = &amp;quot;&amp;lt;span style=&amp;#039;visibility:hidden&amp;#039;&amp;gt;%s%s&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Table storing the format options.&lt;br /&gt;
local FORMAT_TABLE = {&lt;br /&gt;
    dewiki = {&lt;br /&gt;
        decimalMark = &amp;quot;,&amp;quot;,&lt;br /&gt;
        groupMark = &amp;quot;.&amp;quot;,&lt;br /&gt;
        groupMinLength = 4,&lt;br /&gt;
        groupNaturalLength = 5,&lt;br /&gt;
        groupOnlyIntegerPart = false&lt;br /&gt;
         },&lt;br /&gt;
    dewikiint = {&lt;br /&gt;
        decimalMark = &amp;quot;,&amp;quot;,&lt;br /&gt;
        groupMark = THIN_SPACE,&lt;br /&gt;
        groupMinLength = 4,&lt;br /&gt;
        groupNaturalLength = 5,&lt;br /&gt;
        groupOnlyIntegerPart = true&lt;br /&gt;
         },&lt;br /&gt;
    de = {&lt;br /&gt;
        decimalMark = &amp;quot;,&amp;quot;,&lt;br /&gt;
        groupMark = THIN_SPACE,&lt;br /&gt;
        groupMinLength = 4,&lt;br /&gt;
        groupNaturalLength = 4,&lt;br /&gt;
        groupOnlyIntegerPart = false&lt;br /&gt;
         },&lt;br /&gt;
    de_currency = {&lt;br /&gt;
        decimalMark = &amp;quot;,&amp;quot;,&lt;br /&gt;
        groupMark = &amp;quot;.&amp;quot;,&lt;br /&gt;
        groupMinLength = 4,&lt;br /&gt;
        groupNaturalLength = 4,&lt;br /&gt;
        groupOnlyIntegerPart = false&lt;br /&gt;
         },&lt;br /&gt;
    ch = {&lt;br /&gt;
        decimalMark = &amp;quot;,&amp;quot;,&lt;br /&gt;
        groupMark = &amp;quot;&amp;#039;&amp;quot;,&lt;br /&gt;
        groupMinLength = 5,&lt;br /&gt;
        groupNaturalLength = 5,&lt;br /&gt;
        groupOnlyIntegerPart = true&lt;br /&gt;
         },&lt;br /&gt;
    ch_currency = {&lt;br /&gt;
        decimalMark = &amp;quot;.&amp;quot;,&lt;br /&gt;
        groupMark = &amp;quot;&amp;#039;&amp;quot;,&lt;br /&gt;
        groupMinLength = 5,&lt;br /&gt;
        groupNaturalLength = 5,&lt;br /&gt;
        groupOnlyIntegerPart = true&lt;br /&gt;
         },         &lt;br /&gt;
    en = {&lt;br /&gt;
        decimalMark = &amp;quot;.&amp;quot;,&lt;br /&gt;
        groupMark = &amp;quot;,&amp;quot;,&lt;br /&gt;
        groupMinLength = 4,&lt;br /&gt;
        groupNaturalLength = 4,&lt;br /&gt;
        groupOnlyIntegerPart = true&lt;br /&gt;
         },&lt;br /&gt;
    iso31_0 = {    -- ISO 31-0 using comma as decimal mark&lt;br /&gt;
        decimalMark = &amp;quot;,&amp;quot;,&lt;br /&gt;
        groupMark = THIN_SPACE,&lt;br /&gt;
        groupMinLength = 4,&lt;br /&gt;
        groupNaturalLength = 4,&lt;br /&gt;
        groupOnlyIntegerPart = false&lt;br /&gt;
         },&lt;br /&gt;
    iso31_0_point = {    -- ISO 31-0 using dot as decimal mark&lt;br /&gt;
        decimalMark = &amp;quot;.&amp;quot;,&lt;br /&gt;
        groupMark = THIN_SPACE,&lt;br /&gt;
        groupMinLength = 4,&lt;br /&gt;
        groupNaturalLength = 4,&lt;br /&gt;
        groupOnlyIntegerPart = false&lt;br /&gt;
         },&lt;br /&gt;
    comma = {&lt;br /&gt;
        decimalMark = &amp;quot;,&amp;quot;,&lt;br /&gt;
        groupMark = &amp;quot;&amp;quot;,&lt;br /&gt;
        groupMinLength = 1000, -- (for performance, but also small values wouldn&amp;#039;t matter)&lt;br /&gt;
        groupNaturalLength = 1000,&lt;br /&gt;
        groupOnlyIntegerPart = true&lt;br /&gt;
         },&lt;br /&gt;
    heights = {&lt;br /&gt;
        decimalMark = &amp;quot;,&amp;quot;,&lt;br /&gt;
        groupMark = &amp;quot;.&amp;quot;,&lt;br /&gt;
        groupMinLength = 6,&lt;br /&gt;
        groupNaturalLength = 6,&lt;br /&gt;
        groupOnlyIntegerPart = true&lt;br /&gt;
         },&lt;br /&gt;
    pc = nil   -- prevent formatting&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
-- Format table for &amp;quot;at&amp;quot; (only for convenience, same as &amp;quot;iso31_0&amp;quot;).&lt;br /&gt;
FORMAT_TABLE.at = FORMAT_TABLE.iso31_0;&lt;br /&gt;
&lt;br /&gt;
-- Constant defining digit group lengths when digit grouping is used.&lt;br /&gt;
local DIGIT_GROUPING_SIZE = 3;&lt;br /&gt;
&lt;br /&gt;
-- Table defining roman digit values.&lt;br /&gt;
local ROMAN_DIGITS = { I = 1,&lt;br /&gt;
                       V = 5,&lt;br /&gt;
                       X = 10,&lt;br /&gt;
                       L = 50,&lt;br /&gt;
                       C = 100,&lt;br /&gt;
                       D = 500,&lt;br /&gt;
                       M = 1000 };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    Internal used function for rounding.&lt;br /&gt;
&lt;br /&gt;
    @param a_number : Number to be rounded.&lt;br /&gt;
    @param a_precision : Number of significant digits of the fractional part.&lt;br /&gt;
                         If it is negative,&lt;br /&gt;
                         the according number of digits of the integer part are also rounded.&lt;br /&gt;
                         If it is negative but greater 1,&lt;br /&gt;
                         for -.1 -.2 -.3 ... -.9 only the leading digits&lt;br /&gt;
                         will be significant, while&lt;br /&gt;
    @param a_roundMethod : Numeric constant defining the round method to use.&lt;br /&gt;
       Supported are ROUND_TO_EVEN and ROUND_AWAY_FROM_ZERO.&lt;br /&gt;
    @param a_signed : Boolean, shift to typographic minus sign, or precede plus sign.&lt;br /&gt;
&lt;br /&gt;
    @return String of the rounded number like returned by Lua function string.format().&lt;br /&gt;
]]&lt;br /&gt;
local function numberToString( a_number, a_precision, a_roundMethod, a_signed )&lt;br /&gt;
    local suitable;&lt;br /&gt;
    if ( a_precision &amp;lt; 0 ) then&lt;br /&gt;
        a_precision = - a_precision;&lt;br /&gt;
        if ( a_precision &amp;lt; 1 ) then&lt;br /&gt;
            local k = math.log10( math.abs( a_number ) );&lt;br /&gt;
            if ( k &amp;gt; 0 ) then&lt;br /&gt;
                a_precision = math.floor( k )&lt;br /&gt;
                              + 1&lt;br /&gt;
                              - math.floor( a_precision * 10 );&lt;br /&gt;
                if ( a_precision &amp;lt; 0 ) then&lt;br /&gt;
                    a_precision = 0;&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                a_precision = 0;&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            a_precision = math.floor( a_precision );&lt;br /&gt;
        end&lt;br /&gt;
        if (a_roundMethod == ROUND_TO_EVEN) then&lt;br /&gt;
            local integerPart = math.floor(math.abs(a_number) / (10 ^ a_precision));&lt;br /&gt;
            if (integerPart % 2 == 0) then&lt;br /&gt;
                -- next even number smaller than a_number / 10^precision&lt;br /&gt;
                a_number = a_number - 5 * (10 ^ (a_precision - 1));&lt;br /&gt;
                a_number = math.ceil(a_number / (10 ^ a_precision)) * (10 ^ a_precision);&lt;br /&gt;
            else&lt;br /&gt;
                -- next even number bigger than a_number / 10^precision&lt;br /&gt;
                a_number = a_number + 5 * (10 ^ (a_precision - 1));&lt;br /&gt;
                a_number = math.floor(a_number / (10 ^ a_precision)) * (10 ^ a_precision);&lt;br /&gt;
            end&lt;br /&gt;
        elseif (a_roundMethod == ROUND_AWAY_FROM_ZERO) then&lt;br /&gt;
            if (a_number &amp;gt;= 0) then&lt;br /&gt;
                a_number = a_number + 5 * (10 ^ (a_precision - 1));&lt;br /&gt;
                a_number = math.floor(a_number / (10 ^ a_precision)) * (10 ^ a_precision);&lt;br /&gt;
            else&lt;br /&gt;
                a_number = a_number - 5 * (10 ^ (a_precision - 1));&lt;br /&gt;
                a_number = math.ceil(a_number / (10 ^ a_precision)) * (10 ^ a_precision);&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        -- handle it as normal integer&lt;br /&gt;
        a_precision = 0;&lt;br /&gt;
    end&lt;br /&gt;
    if (a_roundMethod == ROUND_AWAY_FROM_ZERO) then&lt;br /&gt;
        if ((a_number * (10 ^ a_precision)) - math.floor(a_number * (10 ^ a_precision)) == 0.5) then&lt;br /&gt;
            -- because string.format() uses round to even, we have to add (numbers &amp;gt;0) or&lt;br /&gt;
            -- subtract (numbers &amp;lt;0) a little bit to point into the &amp;quot;correct&amp;quot; rounding&lt;br /&gt;
            -- direction if a_number is exactly in the middle between two rounded numbers&lt;br /&gt;
            if (a_number &amp;gt;= 0) then&lt;br /&gt;
                a_number = a_number + (10 ^ -(a_precision + 1));&lt;br /&gt;
            else&lt;br /&gt;
                a_number = a_number - (10 ^ -(a_precision + 1));&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            if (math.abs(a_number * (10 ^ a_precision)) &amp;lt; 0.5) then&lt;br /&gt;
                -- filter &amp;quot;-0&amp;quot; and convert it to 0&lt;br /&gt;
                a_number = math.abs(a_number);&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    suitable = string.format( &amp;quot;%%.%df&amp;quot;, a_precision );&lt;br /&gt;
    suitable = string.format( suitable, a_number );&lt;br /&gt;
    if a_signed then&lt;br /&gt;
        if (a_number &amp;gt; 0) then&lt;br /&gt;
            suitable = &amp;quot;+&amp;quot; .. suitable;&lt;br /&gt;
        elseif (a_number &amp;lt; 0) then&lt;br /&gt;
            suitable = mw.ustring.char( 8722 ) .. suitable;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return suitable;&lt;br /&gt;
end -- numberToString()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    Internal used for formatting.&lt;br /&gt;
&lt;br /&gt;
    @param a_number : String (ASCII) of a non-negative number to be formatted.&lt;br /&gt;
    @param a_sign   : String with a sign char, or false&lt;br /&gt;
    @param a_decimalMark : String of the decimal mark to use.&lt;br /&gt;
    @param a_groupMark : String of the mark used for digit grouping.&lt;br /&gt;
    @param a_groupMinLength : Number defining the minimum length of integer part&lt;br /&gt;
       to use digit grouping (normally 4 or 5). However if fractional part is&lt;br /&gt;
       longer than DIGIT_GROUPING_SIZE (3 as default) and digit grouping of&lt;br /&gt;
       fractional part is not disabled via &amp;#039;a_groupOnlyIntegerPart&amp;#039;, then this&lt;br /&gt;
       value is ignored and set to DIGIT_GROUPING_SIZE + 1.&lt;br /&gt;
    @param a_groupNaturalLength : a_groupMinLength for unsigned integer; or nil&lt;br /&gt;
    @param a_groupOnlyIntegerPart : Boolean defining whether activating digit&lt;br /&gt;
       grouping only for integer part (true) or for integer and fractional part&lt;br /&gt;
       (false).&lt;br /&gt;
&lt;br /&gt;
    @return String of the formatted number according to the parameters.&lt;br /&gt;
]]&lt;br /&gt;
local function formatNumber( a_number,&lt;br /&gt;
                             a_sign,&lt;br /&gt;
                             a_decimalMark,&lt;br /&gt;
                             a_groupMark,&lt;br /&gt;
                             a_groupMinLength,&lt;br /&gt;
                             a_groupNaturalLength,&lt;br /&gt;
                             a_groupOnlyIntegerPart )&lt;br /&gt;
    -- find the decimal point&lt;br /&gt;
    local decimalPosition = a_number:find( &amp;quot;.&amp;quot;, 1, true );&lt;br /&gt;
    local needsGrouping = false;&lt;br /&gt;
    if not decimalPosition then&lt;br /&gt;
        -- no decimal point - integer number&lt;br /&gt;
        local minLength = a_groupMinLength;&lt;br /&gt;
        if not a_sign and a_groupNaturalLength then&lt;br /&gt;
            minLength = a_groupNaturalLength;&lt;br /&gt;
        end&lt;br /&gt;
        decimalPosition = #a_number + 1;&lt;br /&gt;
        if decimalPosition &amp;gt; minLength then&lt;br /&gt;
            needsGrouping = true;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        -- decimal point present&lt;br /&gt;
        if decimalPosition &amp;gt; a_groupMinLength&lt;br /&gt;
            or (#a_number - decimalPosition &amp;gt; DIGIT_GROUPING_SIZE&lt;br /&gt;
                and  not a_groupOnlyIntegerPart) then&lt;br /&gt;
            needsGrouping = true;&lt;br /&gt;
        end&lt;br /&gt;
        -- replace the decimal point&lt;br /&gt;
        a_number = a_number:sub( 1, decimalPosition - 1 )&lt;br /&gt;
                   .. a_decimalMark&lt;br /&gt;
                   .. a_number:sub( decimalPosition + 1 );&lt;br /&gt;
    end&lt;br /&gt;
    if needsGrouping and decimalPosition &amp;gt; DIGIT_GROUPING_SIZE + 1 then&lt;br /&gt;
        -- grouping of integer part necessary&lt;br /&gt;
        local i = decimalPosition - DIGIT_GROUPING_SIZE;&lt;br /&gt;
        while (i &amp;gt; 1) do&lt;br /&gt;
            -- group the integer part&lt;br /&gt;
            a_number = a_number:sub( 1, i - 1 )&lt;br /&gt;
                       .. a_groupMark&lt;br /&gt;
                       .. a_number:sub( i );&lt;br /&gt;
            decimalPosition = decimalPosition + #a_groupMark;&lt;br /&gt;
            i = i - DIGIT_GROUPING_SIZE;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- skip to the end of the new decimal mark (in case it is more than one char)&lt;br /&gt;
    decimalPosition = decimalPosition + #a_decimalMark - 1;&lt;br /&gt;
    if a_groupOnlyIntegerPart then&lt;br /&gt;
        needsGrouping = false;&lt;br /&gt;
    end&lt;br /&gt;
    if needsGrouping  and  #a_number - decimalPosition &amp;gt; DIGIT_GROUPING_SIZE then&lt;br /&gt;
        -- grouping of fractional part necessary&lt;br /&gt;
        -- using negative numbers (index from the end of the string)&lt;br /&gt;
        local i = decimalPosition - #a_number + DIGIT_GROUPING_SIZE;&lt;br /&gt;
        while i &amp;lt; 0 do&lt;br /&gt;
            -- group the fractional part&lt;br /&gt;
            a_number = a_number:sub(1, i - 1) .. a_groupMark .. a_number:sub(i);&lt;br /&gt;
            i = i + DIGIT_GROUPING_SIZE;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if (a_sign) then&lt;br /&gt;
        a_number = a_sign .. a_number;&lt;br /&gt;
    end&lt;br /&gt;
    return a_number;&lt;br /&gt;
end -- formatNumber()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    Formatting numbers.&lt;br /&gt;
&lt;br /&gt;
    @param source : Numerical or string representation&lt;br /&gt;
           of an unformatted (but maybe rounded) floating point or integer number.&lt;br /&gt;
    @param spec : Formatting option. Currently there are&lt;br /&gt;
           &amp;quot;at&amp;quot;, &amp;quot;comma&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;dewiki&amp;quot;, &amp;quot;de_currency&amp;quot;, &amp;quot;ch&amp;quot;, &amp;quot;ch_currency&amp;quot;, &amp;quot;en&amp;quot;,&lt;br /&gt;
           &amp;quot;iso31_0&amp;quot;, &amp;quot;iso31_0_point&amp;quot; and &amp;quot;pc&amp;quot; supported.&lt;br /&gt;
           Defaults to &amp;quot;dewiki&amp;quot;.&lt;br /&gt;
           See the FORMAT_TABLE for details.&lt;br /&gt;
    @param meet : HTML padding on left or right end.&lt;br /&gt;
           Defaults to &amp;#039;none&amp;#039; or 0.&lt;br /&gt;
           Positive figures require padding behind decimal mark,&lt;br /&gt;
           negative values ensure at least that absolute value&lt;br /&gt;
           of characters before decimal mark.&lt;br /&gt;
&lt;br /&gt;
    @return String of the formatted number.&lt;br /&gt;
            If the argument &amp;#039;spec&amp;#039; is invalid&lt;br /&gt;
            or &amp;#039;source&amp;#039; is not a valid string representation of a number,&lt;br /&gt;
            &amp;#039;source&amp;#039; is returned unmodified.&lt;br /&gt;
]]&lt;br /&gt;
FormatNum.format = function ( source, spec, meet )&lt;br /&gt;
    local stitch = type( source );&lt;br /&gt;
    local r;&lt;br /&gt;
    if stitch == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = mw.text.trim( source );&lt;br /&gt;
        if r == &amp;quot;&amp;quot; then&lt;br /&gt;
            r = false;&lt;br /&gt;
        end&lt;br /&gt;
    elseif stitch == &amp;quot;number&amp;quot; then&lt;br /&gt;
        r = tostring( source );&lt;br /&gt;
    end&lt;br /&gt;
    if r then&lt;br /&gt;
        if not spec then&lt;br /&gt;
            spec = DEFAULT_FORMAT;&lt;br /&gt;
        end&lt;br /&gt;
        local format = FORMAT_TABLE[ spec ];&lt;br /&gt;
        if format then&lt;br /&gt;
            -- format entry found&lt;br /&gt;
            local sign = mw.ustring.sub( r, 1, 1 );&lt;br /&gt;
            local scan = mw.ustring.format( &amp;quot;^[%%+%%-%c]&amp;quot;, 8722 );&lt;br /&gt;
            local last;&lt;br /&gt;
            if mw.ustring.match( sign, scan ) then&lt;br /&gt;
                -- remove sign from r, add it again later&lt;br /&gt;
                r = mw.ustring.sub( r, 2 );&lt;br /&gt;
            else&lt;br /&gt;
                -- was not a sign&lt;br /&gt;
                sign = false;&lt;br /&gt;
            end&lt;br /&gt;
            if r:sub( 1, 1 ) == &amp;quot;.&amp;quot; then&lt;br /&gt;
                -- r begins with &amp;quot;.&amp;quot; -&amp;gt; add a 0 to the beginning&lt;br /&gt;
                r = &amp;quot;0&amp;quot; .. r;&lt;br /&gt;
            elseif r:sub( -1 ) == &amp;quot;.&amp;quot; then&lt;br /&gt;
                -- r ends with &amp;quot;.&amp;quot; -&amp;gt; remove it&lt;br /&gt;
                r    = r:sub( 1, -2 );&lt;br /&gt;
                last = true;&lt;br /&gt;
            end&lt;br /&gt;
            if r == r:match( &amp;quot;^%d+$&amp;quot; )  or&lt;br /&gt;
               r == r:match( &amp;quot;^%d+%.%d+$&amp;quot; ) then&lt;br /&gt;
                -- r has valid format (only digits or digits.digits)&lt;br /&gt;
                r = formatNumber( r, sign,&lt;br /&gt;
                                  format.decimalMark,&lt;br /&gt;
                                  format.groupMark,&lt;br /&gt;
                                  format.groupMinLength,&lt;br /&gt;
                                  format.groupNaturalLength,&lt;br /&gt;
                                  format.groupOnlyIntegerPart );&lt;br /&gt;
                if meet then&lt;br /&gt;
                    local stop;&lt;br /&gt;
                    if not last then&lt;br /&gt;
                        stop = format.decimalMark;&lt;br /&gt;
                    end&lt;br /&gt;
                    r = FormatNum.padding( r, meet, stop );&lt;br /&gt;
                end&lt;br /&gt;
                if format.groupMark == THIN_SPACE  and&lt;br /&gt;
                   SPACER_SPAN  and&lt;br /&gt;
                   r:find( THIN_SPACE, 2, true ) then&lt;br /&gt;
                    r = r:gsub( THIN_SPACE, SPACER_SPAN );&lt;br /&gt;
                        -- gsub has two results.&lt;br /&gt;
                    r = tostring( mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                                         :css( &amp;quot;white-space&amp;quot;, &amp;quot;nowrap&amp;quot; )&lt;br /&gt;
                                         :wikitext( r ) );&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                -- r has no valid format -&amp;gt; undo all modifications&lt;br /&gt;
                r = source;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- FormatNum.format()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
FormatNum.getromanstring = function(number, style)&lt;br /&gt;
	local zahl = math.floor(math.abs(number)); -- erase several errors like  minus or noninteger&lt;br /&gt;
	zahl = zahl % 1000000; -- truncate to six decimal digits&lt;br /&gt;
	local lower = zahl % 1000;&lt;br /&gt;
	local upper = ((zahl - lower) / 1000)&lt;br /&gt;
	local text = &amp;#039;&amp;#039;;&lt;br /&gt;
	local hunderttausender = (zahl - zahl % 100000 ) / 100000;&lt;br /&gt;
	zahl = zahl % 100000;&lt;br /&gt;
	local zehntausender    = (zahl - zahl % 10000 ) / 10000;&lt;br /&gt;
	zahl = zahl % 10000;&lt;br /&gt;
	local tausender        = (zahl - zahl % 1000 ) / 1000;&lt;br /&gt;
	zahl = zahl % 1000;&lt;br /&gt;
	local hunderter        = (zahl - zahl % 100 ) / 100;&lt;br /&gt;
	zahl = zahl % 100;&lt;br /&gt;
	local zehner           = (zahl - zahl % 10 ) / 10;&lt;br /&gt;
	local einer            = zahl % 10;&lt;br /&gt;
	local digit = {};&lt;br /&gt;
	if upper &amp;gt; 0 then&lt;br /&gt;
		if style==&amp;#039;over&amp;#039; then&lt;br /&gt;
			text = &amp;#039;&amp;lt;span style=&amp;quot;text-decoration:overline&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
			if hunderttausender &amp;gt; 0 then&lt;br /&gt;
				digit = {&amp;#039;C&amp;#039;, &amp;#039;CC&amp;#039;, &amp;#039;CCC&amp;#039;, &amp;#039;CD&amp;#039;, &amp;#039;D&amp;#039;, &amp;#039;DC&amp;#039;, &amp;#039;DCC&amp;#039;, &amp;#039;DCCC&amp;#039;, &amp;#039;CM&amp;#039;} ;&lt;br /&gt;
				text =  text .. digit[hunderttausender];&lt;br /&gt;
			end&lt;br /&gt;
			if zehntausender &amp;gt; 0 then&lt;br /&gt;
				digit = {&amp;#039;X&amp;#039;, &amp;#039;XX&amp;#039;, &amp;#039;XXX&amp;#039;, &amp;#039;XL&amp;#039;, &amp;#039;L&amp;#039;, &amp;#039;LX&amp;#039;, &amp;#039;LXX&amp;#039;, &amp;#039;LXXX&amp;#039;, &amp;#039;XC&amp;#039;} ;&lt;br /&gt;
				text = text .. digit[zehntausender];&lt;br /&gt;
			end&lt;br /&gt;
			if tausender &amp;gt; 0 then&lt;br /&gt;
				digit = {&amp;#039;I&amp;#039;, &amp;#039;II&amp;#039;, &amp;#039;III&amp;#039;, &amp;#039;IV&amp;#039;, &amp;#039;V&amp;#039;, &amp;#039;VI&amp;#039;, &amp;#039;VII&amp;#039;, &amp;#039;VIII&amp;#039;, &amp;#039;IX&amp;#039;} ;&lt;br /&gt;
				text = text .. digit[tausender];&lt;br /&gt;
			end&lt;br /&gt;
			text = text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		elseif style==&amp;#039;apo&amp;#039; then&lt;br /&gt;
			if hunderttausender &amp;gt; 0 then&lt;br /&gt;
				digit = {&lt;br /&gt;
					&amp;#039;&amp;amp;#8584;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8584;&amp;amp;#8584;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8584;&amp;amp;nbsp;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;nbsp;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;nbsp;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;nbsp;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;amp;#8584;&amp;#039;&lt;br /&gt;
				} ;&lt;br /&gt;
				text =  text .. digit[hunderttausender];&lt;br /&gt;
			end&lt;br /&gt;
			if zehntausender &amp;gt; 0 then&lt;br /&gt;
				digit = {&lt;br /&gt;
					&amp;#039;&amp;amp;#8578;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8578;&amp;amp;#8578;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8578;&amp;amp;#8578;&amp;amp;#8578;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8578;&amp;amp;#8583;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8583;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8583;&amp;amp;#8578;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8583;&amp;amp;#8578;&amp;amp;#8578;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8583;&amp;amp;#8578;&amp;amp;#8578;&amp;amp;#8578;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8578;&amp;amp;#8584;&amp;#039;&lt;br /&gt;
				} ;&lt;br /&gt;
				text = text .. digit[zehntausender];&lt;br /&gt;
			end&lt;br /&gt;
			if tausender &amp;gt; 0 then&lt;br /&gt;
				digit = {&lt;br /&gt;
					&amp;#039;&amp;amp;#8576;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8576;&amp;amp;#8576;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8576;&amp;amp;#8576;&amp;amp;#8576;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8576;&amp;amp;#8577;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8577;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8577;&amp;amp;#8576;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8577;&amp;amp;#8576;&amp;amp;#8576;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8577;&amp;amp;#8576;&amp;amp;#8576;&amp;amp;#8576;&amp;#039;,&lt;br /&gt;
					&amp;#039;&amp;amp;#8576;&amp;amp;#8578;&amp;#039;&lt;br /&gt;
				} ;&lt;br /&gt;
				text = text .. digit[tausender];&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if upper &amp;lt; 10 then&lt;br /&gt;
				text = string.rep(&amp;#039;M&amp;#039;,upper);&lt;br /&gt;
			else&lt;br /&gt;
				text = &amp;#039;ERR!...&amp;#039;; -- klassische M nur bis 9999&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end  -- Ende  upper &amp;gt; 0 &lt;br /&gt;
	if lower &amp;gt; 0 then&lt;br /&gt;
		if upper &amp;gt; 0 then&lt;br /&gt;
			text = text .. &amp;#039;&amp;amp;nbsp;&amp;#039;;&lt;br /&gt;
		end&lt;br /&gt;
		if hunderter &amp;gt; 0 then&lt;br /&gt;
			digit = {&amp;#039;C&amp;#039;, &amp;#039;CC&amp;#039;, &amp;#039;CCC&amp;#039;, &amp;#039;CD&amp;#039;, &amp;#039;D&amp;#039;, &amp;#039;DC&amp;#039;, &amp;#039;DCC&amp;#039;, &amp;#039;DCCC&amp;#039;, &amp;#039;CM&amp;#039;} ;&lt;br /&gt;
			if  style==&amp;#039;apo&amp;#039; then&lt;br /&gt;
				digit[9] =  &amp;#039;C&amp;amp;#8576;&amp;#039;;&lt;br /&gt;
			end&lt;br /&gt;
			text = text .. digit[hunderter];&lt;br /&gt;
		end&lt;br /&gt;
		if zehner &amp;gt; 0 then&lt;br /&gt;
			digit = {&amp;#039;X&amp;#039;, &amp;#039;XX&amp;#039;, &amp;#039;XXX&amp;#039;, &amp;#039;XL&amp;#039;, &amp;#039;L&amp;#039;, &amp;#039;LX&amp;#039;, &amp;#039;LXX&amp;#039;, &amp;#039;LXXX&amp;#039;, &amp;#039;XC&amp;#039;} ;&lt;br /&gt;
			text = text .. digit[zehner];&lt;br /&gt;
		end&lt;br /&gt;
		if einer &amp;gt; 0 then&lt;br /&gt;
			digit = {&amp;#039;I&amp;#039;, &amp;#039;II&amp;#039;, &amp;#039;III&amp;#039;, &amp;#039;IV&amp;#039;, &amp;#039;V&amp;#039;, &amp;#039;VI&amp;#039;, &amp;#039;VII&amp;#039;, &amp;#039;VIII&amp;#039;, &amp;#039;IX&amp;#039;} ;&lt;br /&gt;
			text = text .. digit[einer];&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    Convert possible Unicode minus U+2212 into ASCII hyphen-minus.&lt;br /&gt;
&lt;br /&gt;
    @param source : String representation of a number.&lt;br /&gt;
    @param larger : nil/false = Unicode -&amp;gt; ASCII.&lt;br /&gt;
&lt;br /&gt;
    @return String with one Unicode minus replaced by ASCII hyphen-minus.&lt;br /&gt;
]]&lt;br /&gt;
FormatNum.minus = function ( source, larger )&lt;br /&gt;
    local r = mw.ustring.char( 8722 );&lt;br /&gt;
    if larger then&lt;br /&gt;
        r = source:gsub( &amp;quot;-&amp;quot;, r, 1 );&lt;br /&gt;
    else&lt;br /&gt;
        r = mw.ustring.gsub( source, r, &amp;quot;-&amp;quot;, 1 );&lt;br /&gt;
    end&lt;br /&gt;
    -- gsub has two results.&lt;br /&gt;
    return r;&lt;br /&gt;
end -- FormatNum.minus()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    HTML padding of number strings.&lt;br /&gt;
&lt;br /&gt;
    @param number : string with floating point or integer number&lt;br /&gt;
    @param meet :  Positive figures require padding behind decimal mark,&lt;br /&gt;
           negative values ensure at least that absolute value&lt;br /&gt;
           of characters before decimal mark.&lt;br /&gt;
           Defaults to &amp;#039;none&amp;#039; or 0.&lt;br /&gt;
    @param stop : string with decimal mark; if false: number is integer.&lt;br /&gt;
&lt;br /&gt;
    @return String of the formatted number.&lt;br /&gt;
]]&lt;br /&gt;
FormatNum.padding = function ( number, meet, stop )&lt;br /&gt;
    local r = number;&lt;br /&gt;
    if type( number ) == &amp;quot;string&amp;quot;    and&lt;br /&gt;
       type( meet ) == &amp;quot;number&amp;quot;    and&lt;br /&gt;
       ( not stop   or&lt;br /&gt;
         ( type( stop ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
           stop:match( &amp;quot;^%p$&amp;quot; ) ) ) then&lt;br /&gt;
        local m = math.floor( meet );&lt;br /&gt;
        if m ~= 0 then&lt;br /&gt;
            local i, s;&lt;br /&gt;
            r = mw.text.trim( r );&lt;br /&gt;
            if stop then&lt;br /&gt;
                i = r:find( stop, 1, true );&lt;br /&gt;
                s = &amp;quot;&amp;quot;;&lt;br /&gt;
            else&lt;br /&gt;
                i = mw.ustring.len( r );&lt;br /&gt;
                s = &amp;quot;.&amp;quot;;&lt;br /&gt;
            end&lt;br /&gt;
            if i then&lt;br /&gt;
                local left = ( m &amp;lt; 0 );&lt;br /&gt;
                local n    = m + i;&lt;br /&gt;
                if left then&lt;br /&gt;
                    n = 1 - n;&lt;br /&gt;
                else&lt;br /&gt;
                    n = n - mw.ustring.len( r );&lt;br /&gt;
                end&lt;br /&gt;
                if n &amp;gt; 0 then&lt;br /&gt;
                    s = string.format( PADDING_SPAN,&lt;br /&gt;
                                       s,&lt;br /&gt;
                                       string.rep( &amp;quot;0&amp;quot;, n ) );&lt;br /&gt;
                    if left then&lt;br /&gt;
                        r = s .. r;&lt;br /&gt;
                    else&lt;br /&gt;
                        r = r .. s;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- FormatNum.padding()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    Convert string of roman digits into number.&lt;br /&gt;
    @param roman :  string with roman number, case-insensitive,&lt;br /&gt;
                    and possibly trailing suffix.&lt;br /&gt;
    @param suffix : nil, or string with pattern for permitted suffix.&lt;br /&gt;
    @return&lt;br /&gt;
        1. Read number, or false if error.&lt;br /&gt;
        2. nil, or string with detected trailing suffix.&lt;br /&gt;
]]&lt;br /&gt;
FormatNum.roman2number = function ( roman, suffix )&lt;br /&gt;
    local d  = mw.text.split( roman, &amp;quot;&amp;quot; );&lt;br /&gt;
    local n  = #d;&lt;br /&gt;
    local r  = 0;&lt;br /&gt;
    local r2 = false;&lt;br /&gt;
    local k;&lt;br /&gt;
    for i = 1, n do&lt;br /&gt;
        k = ROMAN_DIGITS[ d[ i ]:upper() ];&lt;br /&gt;
        if k then&lt;br /&gt;
            d[ i ] = k;&lt;br /&gt;
        else&lt;br /&gt;
            r2 = table.concat( d, &amp;quot;&amp;quot;, i );&lt;br /&gt;
            if suffix   and   mw.ustring.match( r2, &amp;quot;^&amp;quot; .. suffix ) then&lt;br /&gt;
                n = i - 1;&lt;br /&gt;
            else&lt;br /&gt;
                r = false;&lt;br /&gt;
            end&lt;br /&gt;
            break;    -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end    -- for i&lt;br /&gt;
    if r then&lt;br /&gt;
        local j = 0;&lt;br /&gt;
        local l = true;&lt;br /&gt;
        for i = n, 1, -1 do&lt;br /&gt;
            k = d[ i ];&lt;br /&gt;
            if k &amp;gt; j then&lt;br /&gt;
                r = r + k;&lt;br /&gt;
                l = true;&lt;br /&gt;
            elseif k &amp;lt; j then&lt;br /&gt;
                r = r - k;&lt;br /&gt;
                l = false;&lt;br /&gt;
            elseif l then&lt;br /&gt;
                r = r + k;&lt;br /&gt;
            else&lt;br /&gt;
                r = r - k;&lt;br /&gt;
            end&lt;br /&gt;
            j = k;&lt;br /&gt;
        end    -- for i&lt;br /&gt;
    end&lt;br /&gt;
    return r, r2;&lt;br /&gt;
end -- FormatNum.roman2number()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    Rounding numbers.&lt;br /&gt;
&lt;br /&gt;
    @param number : string with unformatted floating point or integer number, or number.&lt;br /&gt;
    @param precision : number of significant fractional part digits.&lt;br /&gt;
           If precision is negative, the integer part is rounded as well.&lt;br /&gt;
    @param method : number defining the rounding method to use.&lt;br /&gt;
           Currently are supported only&lt;br /&gt;
              0 for &amp;#039;IEEE 754&amp;#039; rounding (default) and&lt;br /&gt;
              1 for &amp;#039;round half away from zero&amp;#039;.&lt;br /&gt;
           If another number is supplied, the result is undefined.&lt;br /&gt;
    @param lone : boolean or nil; omit decimal separator&lt;br /&gt;
           on floating point numbers without triling digits.&lt;br /&gt;
&lt;br /&gt;
    @return String of the rounded number as returned by Lua function string.format().&lt;br /&gt;
]]&lt;br /&gt;
FormatNum.round = function ( source, precision, method, lone )&lt;br /&gt;
    local n = math.floor( precision );&lt;br /&gt;
    local r;&lt;br /&gt;
    if n then&lt;br /&gt;
        local stitch = type( source );&lt;br /&gt;
        local lower;&lt;br /&gt;
        if stitch == &amp;quot;string&amp;quot; then&lt;br /&gt;
            r = mw.text.trim( source );&lt;br /&gt;
            if r == &amp;quot;&amp;quot; then&lt;br /&gt;
                r = false;&lt;br /&gt;
            elseif n &amp;gt; 0 then&lt;br /&gt;
                local s = r:match( &amp;quot;^-?%d+%.(%d+)$&amp;quot; );&lt;br /&gt;
                if not s  or  #s &amp;lt; n then&lt;br /&gt;
                    n = false;&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                lower = r:find( &amp;quot;.&amp;quot;, 1, true )  and  not lone;&lt;br /&gt;
            end&lt;br /&gt;
            if r and n then&lt;br /&gt;
                r = tonumber( r );&lt;br /&gt;
            end&lt;br /&gt;
        elseif stitch == &amp;quot;number&amp;quot; then&lt;br /&gt;
            r = source;&lt;br /&gt;
        end&lt;br /&gt;
        if r and n then&lt;br /&gt;
            local m;&lt;br /&gt;
            if type( method ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
                m = math.floor( method );&lt;br /&gt;
            else&lt;br /&gt;
                m = DEFAULT_METHOD;&lt;br /&gt;
            end&lt;br /&gt;
            r = numberToString( r, n, m );&lt;br /&gt;
            if lower then&lt;br /&gt;
                r = r .. &amp;quot;.&amp;quot;;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or source;&lt;br /&gt;
end -- FormatNum.round()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    Retrieve versioning and check for compliance.&lt;br /&gt;
&lt;br /&gt;
    @param assert : string with with required version, or false.&lt;br /&gt;
&lt;br /&gt;
    @return String with appropriate version, or false.&lt;br /&gt;
]]&lt;br /&gt;
FormatNum.failsafe = function ( assert )&lt;br /&gt;
    local since = assert;&lt;br /&gt;
    local r;&lt;br /&gt;
    if since == &amp;quot;wikidata&amp;quot; then&lt;br /&gt;
        local item = FormatNum.item;&lt;br /&gt;
        since = false;&lt;br /&gt;
        if type( item ) == &amp;quot;number&amp;quot;  and  item &amp;gt; 0 then&lt;br /&gt;
            local entity = mw.wikibase.getEntity( string.format( &amp;quot;Q%d&amp;quot;,&lt;br /&gt;
                                                                 item ) );&lt;br /&gt;
            if type( entity ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                local vsn = entity:formatPropertyValues( &amp;quot;P348&amp;quot; );&lt;br /&gt;
                if type( vsn ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                   type( vsn.value) == &amp;quot;string&amp;quot; and&lt;br /&gt;
                   vsn.value ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                    r = vsn.value;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not r then&lt;br /&gt;
        if not since  or  since &amp;lt;= FormatNum.serial then&lt;br /&gt;
            r = FormatNum.serial;&lt;br /&gt;
        else&lt;br /&gt;
            r = false;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- FormatNum.failsafe()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local p = { };&lt;br /&gt;
&lt;br /&gt;
p.format = function ( frame )&lt;br /&gt;
    -- @param 1 : unformatted (but maybe rounded) floating point or integer number.&lt;br /&gt;
    -- @param 2 : Formatting option. Currently there are supported:&lt;br /&gt;
    --                 &amp;quot;at&amp;quot;, &amp;quot;comma&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;dewiki&amp;quot;, &amp;quot;de_currency&amp;quot;, &amp;quot;ch&amp;quot;,&lt;br /&gt;
    --                 &amp;quot;ch_currency&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;iso31_0&amp;quot;, &amp;quot;iso31_0_point&amp;quot; and &amp;quot;pc&amp;quot;.&lt;br /&gt;
    local source = frame.args[ 1 ];&lt;br /&gt;
    local spec   = frame.args[ 2 ];&lt;br /&gt;
    if spec then&lt;br /&gt;
        spec = mw.text.trim( spec );&lt;br /&gt;
        if spec == &amp;quot;&amp;quot; then&lt;br /&gt;
            spec = false;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return FormatNum.format( source, spec )  or  &amp;quot;&amp;quot;;&lt;br /&gt;
end -- .format()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.minus = function ( frame )&lt;br /&gt;
    -- @param 1 : number, with possible Unicode minus or vice versa.&lt;br /&gt;
    -- @param 2 : boolean, turning ASCII hyphen into Unicode minus.&lt;br /&gt;
    local larger = frame.args[ 2 ];&lt;br /&gt;
    if larger then&lt;br /&gt;
        larger = mw.text.trim( larger );&lt;br /&gt;
        if larger == &amp;quot;&amp;quot; or larger == &amp;quot;0&amp;quot; then&lt;br /&gt;
            larger = false;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return FormatNum.minus( frame.args[ 1 ], larger );&lt;br /&gt;
end -- .minus()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.padding = function ( frame )&lt;br /&gt;
    -- @param 1 : number to be padded&lt;br /&gt;
    -- @param 2 : number of trailing or leading figures for alignment&lt;br /&gt;
    -- @param 3 : string with decimal mark&lt;br /&gt;
    local r    = frame.args[ 1 ];&lt;br /&gt;
    local meet = tonumber( frame.args[ 2 ] );&lt;br /&gt;
    local stop = frame.args[ 3 ];&lt;br /&gt;
    if r and meet and stop then&lt;br /&gt;
        stop = mw.text.trim( stop );&lt;br /&gt;
        r = FormatNum.padding( r, meet, stop );&lt;br /&gt;
    else&lt;br /&gt;
        r = r or &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- .padding()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.roman =  function ( frame )&lt;br /&gt;
    -- @param 1 : an Integer less than 1 000 000&lt;br /&gt;
    -- @param 2 : formatting code: &amp;#039;over&amp;#039; for overline style, &amp;#039;apo&amp;#039; for apostrophus, any other for &amp;#039;M&amp;#039; only up to 9999&lt;br /&gt;
    local para1 =  tonumber(frame.args[1] or &amp;#039;&amp;#039;) or 0 ;&lt;br /&gt;
    local para2 =  string.lower(frame.args[2] or &amp;#039;&amp;#039;);&lt;br /&gt;
	return FormatNum.getromanstring(para1,para2)  or  &amp;quot;&amp;quot;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.roman2number = function ( frame )&lt;br /&gt;
    -- @param 1 : roman number, possibly with trailing suffix&lt;br /&gt;
    -- @param 2 : pattern for permitted suffix, or not&lt;br /&gt;
    local r = frame.args[ 1 ];&lt;br /&gt;
    if r then&lt;br /&gt;
        local suffix = frame.args[ 2 ];&lt;br /&gt;
        r = mw.text.trim( r );&lt;br /&gt;
        if #r &amp;gt; 0 then&lt;br /&gt;
            if suffix then&lt;br /&gt;
                suffix = mw.text.trim( suffix );&lt;br /&gt;
                if #suffix == 0 then&lt;br /&gt;
                    suffix = false;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            r = FormatNum.roman2number( r, suffix )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;;&lt;br /&gt;
end -- .roman2number()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.round = function ( frame )&lt;br /&gt;
    -- @param 1 : unformatted floating point or integer number.&lt;br /&gt;
    -- @param 2 : precision; number of significant fractional part digits.&lt;br /&gt;
    --            If precision is negative, the integer part is rounded as well.&lt;br /&gt;
    -- @param method : number defining the rounding method to be used.&lt;br /&gt;
    --                 Currently are supported only&lt;br /&gt;
    --                    0 for &amp;#039;IEEE 754&amp;#039; rounding (default) and&lt;br /&gt;
    --                    1 for &amp;#039;round half away from zero&amp;#039;.&lt;br /&gt;
    --                 If another number is supplied, the result is undefined.&lt;br /&gt;
    -- @param format : trigger formatting, if set to a formatting option.&lt;br /&gt;
    -- @param padding : trigger formatting and padding, if set to a number.&lt;br /&gt;
    local r         = frame.args[ 1 ];&lt;br /&gt;
    local precision = tonumber( frame.args[ 2 ] );&lt;br /&gt;
    if r and precision then&lt;br /&gt;
        local suitable = frame.args.format;&lt;br /&gt;
        local meet     = tonumber( frame.args.padding );&lt;br /&gt;
        local method   = tonumber( frame.args.method );&lt;br /&gt;
        local int      = frame.args[ 2 ]:find( &amp;quot;-0&amp;quot;, 1, true );&lt;br /&gt;
        r = FormatNum.round( r, precision, method, int );&lt;br /&gt;
        if suitable then&lt;br /&gt;
            suitable = mw.text.trim( suitable );&lt;br /&gt;
            if #suitable == 0 then&lt;br /&gt;
                suitable = false;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if suitable or meet then&lt;br /&gt;
            r = FormatNum.format( r, suitable, meet );&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = r or &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- .round()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.failsafe = function ( frame )&lt;br /&gt;
    -- Retrieve versioning and check for compliance.&lt;br /&gt;
    -- @param 1 : string with with required version, or empty.&lt;br /&gt;
    -- @return String with appropriate version, or false.&lt;br /&gt;
    local s = type( frame );&lt;br /&gt;
    local since;&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        since = frame.args[ 1 ];&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        since = frame;&lt;br /&gt;
    end&lt;br /&gt;
    if since then&lt;br /&gt;
        since = mw.text.trim( since );&lt;br /&gt;
        if #since == 0 then&lt;br /&gt;
            since = false;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return FormatNum.failsafe( since )  or  &amp;quot;&amp;quot;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Export access for Lua modules&lt;br /&gt;
p.FormatNum = function ()&lt;br /&gt;
    return FormatNum;&lt;br /&gt;
end -- .FormatNum()&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>wikipedia:de&gt;Antonsusi</name></author>
	</entry>
</feed>