Модуль:Math/tonumber
Этот модуль содержит функции для конвертации строк в числа.
Вызываемые функции[править код]
integer[править код]
{{#invoke:Math/tonumber|integer|…}}
Возвращает первое целое положительное число, найденное в строке.
Входное значение | Результат |
---|---|
2014 | 2014 |
[[2014]] | 2014 |
[[2014 год|2014]] | 2014 |
[[31 декабря]] [[2014]] | 31 |
Як-42 | 42 |
Используется в шаблонах, когда надо.
quantity[править код]
{{#invoke:Math/tonumber|quantity|…}}
Возвращает количественное значение из строки.
Входное значение | Результат |
---|---|
100 000 | 100000 |
100 тыс. чел. | 100000 |
100,9 тыс. чел. | 100900 |
100,90 тыс. чел. | 100900 |
100,90 тыс. чел. (2017) | 100900 |
100 000 ± 10 | 100000 |
Используется в шаблонах, когда надо.
year[править код]
Возвращает последнее из чисел, найденных в строке, подходящее по формату в качестве года.
- Приоритет отдаётся 4-значному числу, начинающемуся на 1 или 2
- Иначе будет возвращено 3-значное число
- Если в строке есть несколько чисел одной длины, то будет выбрано последнее из них
{{#invoke:Math/tonumber|year|…}} {{#invoke:Math/tonumber|year|…|default=…}}
Входное значение | Результат |
---|---|
2014 | 2014 |
910 | 910 |
[[2014]] | 2014 |
[[2014 год|2014]] | 2014 |
[[31 декабря]] [[2014]] | 2014 |
2014—2018 | 2018 |
Як-42 | |
[[2316 год до н. э.]] | -2316 |
100,90 тыс. чел. (2017) | 2017 |
Используется в шаблонах {{Категория по дате}} и {{Год появления}}.
Тесты[править код]
1 тестов провалено.
Тест | Ожидаемое значение | Фактическое значение | |
---|---|---|---|
✔ | {{ #invoke:Math/tonumber|integer | 2014 }} | 2014 | 2014 |
✔ | {{ #invoke:Math/tonumber|integer | 910 }} | 910 | 910 |
✔ | {{ #invoke:Math/tonumber|integer | 14 }} | 14 | 14 |
✔ | {{ #invoke:Math/tonumber|integer | 1 }} | 1 | 1 |
✔ | {{ #invoke:Math/tonumber|integer | -100 }} | 100 | 100 |
✔ | {{ #invoke:Math/tonumber|integer | [[2014]] }} | 2014 | 2014 |
✔ | {{ #invoke:Math/tonumber|integer | [[2014 год|2014]] }} | 2014 | 2014 |
✔ | {{ #invoke:Math/tonumber|integer | [[31 декабря]] [[2014]] }} | 31 | 31 |
✔ | {{ #invoke:Math/tonumber|integer | [[2316 год до н. э.]] }} | 2316 | 2316 |
✔ | {{ #invoke:Math/tonumber|integer | 22 марта 14 года }} | 22 | 22 |
✔ | {{ #invoke:Math/tonumber|integer | Як-42 }} | 42 | 42 |
Тест | Ожидаемое значение | Фактическое значение | |
---|---|---|---|
✔ | {{ #invoke:Math/tonumber|year | 2014 }} | 2014 | 2014 |
✔ | {{ #invoke:Math/tonumber|year | 910 }} | 910 | 910 |
✔ | {{ #invoke:Math/tonumber|year | 14 }} | 14 | 14 |
✔ | {{ #invoke:Math/tonumber|year | 1 }} | 1 | 1 |
Файл:X mark.svg | {{ #invoke:Math/tonumber|year | -100 }} | 100 | |
✔ | {{ #invoke:Math/tonumber|year | 10 год до н. э. }} | -10 | -10 |
✔ | {{ #invoke:Math/tonumber|year | 1 до н.э }} | -1 | -1 |
✔ | {{ #invoke:Math/tonumber|year | [[10 год до н. э.]] }} | -10 | -10 |
✔ | {{ #invoke:Math/tonumber|year | [[2014]] }} | 2014 | 2014 |
✔ | {{ #invoke:Math/tonumber|year | [[2014 год|2014]] }} | 2014 | 2014 |
✔ | {{ #invoke:Math/tonumber|year | [[31 декабря]] [[2014]] }} | 2014 | 2014 |
✔ | {{ #invoke:Math/tonumber|year | 2014—2018 }} | 2018 | 2018 |
✔ | {{ #invoke:Math/tonumber|year | [[2316 год до н. э.]] }} | -2316 | -2316 |
✔ | {{ #invoke:Math/tonumber|year | 22 марта 14 года }} | ||
✔ | {{ #invoke:Math/tonumber|year | Як-42 }} |
--[[ This module convert strings to numbers. ]] local p = {} -- Get first integer number from string. function p.integer( frame ) local s = frame.args[1] s = string.gsub( s, '<[^<>]+>', '' ) -- strip HTML tags s = string.gsub( s, '[^0-9]', ' ' ) s = mw.text.trim( s ) s = mw.text.split( s, ' ' )[1] return tonumber( s ) end -- Get number from quantity (e.g. from Wikidata). function p.quantity( frame ) local s = frame.args[1] s = string.gsub( s, '<[^<>]+>', '' ) -- strip HTML tags s = string.gsub( s, ' ', '' ) s = string.gsub( s, 'тыс', '000' ) s = string.gsub( s, 'млн', '000000' ) s = string.gsub( s, 'млрд', '000000000' ) s = string.gsub( s, ',(%d%d%d)000', '%1' ) s = string.gsub( s, ',(%d%d)000', '%10' ) s = string.gsub( s, ',(%d)000', '%100' ) s = string.gsub( s, '±.*$', '' ) s = string.gsub( s, '[^0-9]', ' ' ) s = mw.text.trim( s ) s = mw.text.split( s, ' ' )[1] return tonumber( s ) end -- Get year value from string. function p.year( frame ) local n = nil local cat = frame.args['cat'] -- 'году' or 'года' local yearForm = 'году' if frame.args['form'] and frame.args['form'] ~= '' then yearForm = frame.args['form'] end local s = frame.args[1] s = string.gsub( s, '<[^<>]+>', '' ) -- strip HTML tags local isBce = string.match( s, 'до%sн\.%s?э' ) s = string.gsub( s, 'год%sдо%sн\.%s*э\.?', '' ) s = string.gsub( s, 'до%sн\.%s*э\.?', '' ) -- Get first 3- or 4-digit integer number from string. local sParts = string.gsub( s, '[^0-9]', ' ' ) sParts = mw.text.trim( sParts ) sParts = mw.text.split( sParts, ' +' ) for k = #sParts, 1, -1 do v = sParts[k] if string.match( v, '^[12]%d%d%d$' ) then n = tonumber( v ) break end end -- The entire string is a number. if not n then s = string.gsub( s, '[%[%]]', '' ) s = mw.text.trim( s ) if string.match( s, '^%d%d?%d?%d?$' ) then n = tonumber( s ) end end -- Generate category if n then if isBce then if cat then return '[[К:' .. cat .. ' ' .. n .. ' ' .. yearForm .. ' до н. э.]]' end n = -n else if cat then return '[[К:' .. cat .. ' ' .. n .. ' ' .. yearForm .. ']]' end end end return n or frame.args['default'] end return p