Перейти к навигации Перейти к поиску
Документация по модулю [ просмотреть ] [ изменить ] [ историю ] [ очистить ]
Этот модуль оценен как готовый к общему использованию . Он достиг зрелой формы и считается относительно свободным от ошибок и готовым к использованию везде, где это необходимо. Он готов упоминаться на страницах справки и других ресурсах Википедии как вариант для изучения новыми пользователями. Чтобы уменьшить нагрузку на сервер и плохой вывод, его следует улучшить с помощью тестирования в песочнице, а не повторного редактирования методом проб и ошибок. |
Этот модуль используется в MediaWiki: Watchlist-messages . Его изменения могут вызвать немедленные изменения в пользовательском интерфейсе Википедии. Чтобы избежать крупномасштабных сбоев, любые изменения следует сначала протестировать на подстранице / sandbox или / testcases этого модуля или в вашем собственном пользовательском пространстве . Затем протестированные изменения могут быть добавлены в этот модуль за один раз. Пожалуйста, обсудите любые изменения на странице обсуждения, прежде чем внедрять их. |
Этот модуль Lua используется примерно на 23 000 страницах, и изменения могут быть широко заметны. Протестируйте изменения на подстраницах модуля / sandbox или / testcases . Обсудите изменения на странице обсуждения, прежде чем внедрять их. Счетчик включений обновляется автоматически ( см. Документацию ). |
использование
{{#invoke: ConvertNumeric | function_name }}
Смотрите также
- {{ Spellnum per MOS }}
- {{ Число в слово }}
- Модуль: StripToNumbers - извлекает число из строки (поддерживает отрицательные и десятичные дроби) и возвращает его или, при необходимости, возвращает уменьшенное вдвое значение
- Модуль для преобразования между разными представлениями чисел. См. Страницу обсуждения для пользовательской документации.- Для модульных тестов см: [[Module: ConvertNumeric / testcases]]- При редактировании предварительный просмотр с помощью: [[Module_talk: ConvertNumeric / testcases]]- Сначала отредактируйте [[Module: ConvertNumeric / sandbox]], затем выполните предварительный просмотр с помощью [[Module_talk: ConvertNumeric / sandbox / testcases]]local ones_position = {[ 0 ] = "ноль" ,[ 1 ] = 'один' ,[ 2 ] = "два" ,[ 3 ] = "три" ,[ 4 ] = "четыре" ,[ 5 ] = 'пять' ,[ 6 ] = "шесть" ,[ 7 ] = 'семь' ,[ 8 ] = 'восемь' ,[ 9 ] = "девять" ,[ 10 ] = 'десять' ,[ 11 ] = 'одиннадцать' ,[ 12 ] = 'двенадцать' ,[ 13 ] = 'тринадцать' ,[ 14 ] = 'четырнадцать' ,[ 15 ] = 'пятнадцать' ,[ 16 ] = 'шестнадцать' ,[ 17 ] = 'семнадцать' ,[ 18 ] = 'восемнадцать' ,[ 19 ] = 'девятнадцать'}local ones_position_ord = {[ 0 ] = 'нулевой' ,[ 1 ] = 'первый' ,[ 2 ] = 'секунда' ,[ 3 ] = 'третий' ,[ 4 ] = "четвертый" ,[ 5 ] = "пятая" ,[ 6 ] = "шестой" ,[ 7 ] = "седьмой" ,[ 8 ] = 'восьмой' ,[ 9 ] = 'девятая' ,[ 10 ] = 'десятая' ,[ 11 ] = 'одиннадцатое' ,[ 12 ] = "двенадцатое" ,[ 13 ] = 'тринадцатый' ,[ 14 ] = "четырнадцатое" ,[ 15 ] = "пятнадцатый" ,[ 16 ] = "шестнадцатое" ,[ 17 ] = "семнадцатое" ,[ 18 ] = 'восемнадцатое' ,[ 19 ] = "девятнадцатое"}local ones_position_plural = {[ 0 ] = 'нули' ,[ 1 ] = 'единицы' ,[ 2 ] = "двое" ,[ 3 ] = 'тройки' ,[ 4 ] = "четверки" ,[ 5 ] = "пятерки" ,[ 6 ] = "шестерки" ,[ 7 ] = "семерки" ,[ 8 ] = 'восьмерки' ,[ 9 ] = "девятки" ,[ 10 ] = "десятки" ,[ 11 ] = 'одиннадцать' ,[ 12 ] = 'двенадцать' ,[ 13 ] = 'тринадцать' ,[ 14 ] = 'четырнадцать' ,[ 15 ] = 'пятнадцать' ,[ 16 ] = "шестнадцать" ,[ 17 ] = 'семнадцать' ,[ 18 ] = 'восемнадцать' ,[ 19 ] = 'девятнадцать'}local tens_position = {[ 2 ] = "двадцать" ,[ 3 ] = 'тридцать' ,[ 4 ] = 'сорок' ,[ 5 ] = 'пятьдесят' ,[ 6 ] = 'шестьдесят' ,[ 7 ] = "семьдесят" ,[ 8 ] = 'восемьдесят' ,[ 9 ] = "девяносто"}local tens_position_ord = {[ 2 ] = "двадцатое" ,[ 3 ] = 'тридцатый' ,[ 4 ] = "сороковой" ,[ 5 ] = "пятидесятая" ,[ 6 ] = "шестидесятый" ,[ 7 ] = "семидесятое" ,[ 8 ] = "восьмидесятая" ,[ 9 ] = "девяносто"}local tens_position_plural = {[ 2 ] = 'двадцатые' ,[ 3 ] = 'тридцатые' ,[ 4 ] = 'сороковые' ,[ 5 ] = 'пятидесятые' ,[ 6 ] = "шестидесятые" ,[ 7 ] = 'семидесятые' ,[ 8 ] = 'восьмидесятые' ,[ 9 ] = "девяностые"}местные группы = {[ 1 ] = 'тысяча' ,[ 2 ] = 'миллион' ,[ 3 ] = 'миллиард' ,[ 4 ] = "триллион" ,[ 5 ] = "квадриллион" ,[ 6 ] = 'квинтиллион' ,[ 7 ] = 'секстиллион' ,[ 8 ] = 'септиллион' ,[ 9 ] = 'октиллион' ,[ 10 ] = 'нониллион' ,[ 11 ] = "дециллион" ,[ 12 ] = 'ундециллион' ,[ 13 ] = 'дуодециллион' ,[ 14 ] = 'tredecillion' ,[ 15 ] = 'quattuordecillion' ,[ 16 ] = "квиндециллион" ,[ 17 ] = 'sexdecillion' ,[ 18 ] = 'семидециллион' ,[ 19 ] = 'октодециллион' ,[ 20 ] = 'novemdecillion' ,[ 21 ] = 'виджинтиллион' ,[ 22 ] = 'unvigintillion' ,[ 23 ] = 'дуовигинтиллион' ,[ 24 ] = 'тресвигинтиллион' ,[ 25 ] = 'quattuorvigintillion' ,[ 26 ] = 'квинквавинтиллион' ,[ 27 ] = 'sesvigintillion' ,[ 28 ] = 'septemvigintillion' ,[ 29 ] = 'октовигинтиллион' ,[ 30 ] = 'новемвигинтиллион' ,[ 31 ] = 'тригинтиллион' ,[ 32 ] = "нетригинтиллион" ,[ 33 ] = 'дуотригинтиллион' ,[ 34 ] = 'трестригинтиллион' ,[ 35 ] = 'quattuortrigintillion' ,[ 36 ] = 'квинкватригинтиллион' ,[ 37 ] = 'сестригинтиллион' ,[ 38 ] = 'септентригинтиллион' ,[ 39 ] = 'октотригинтиллион' ,[ 40 ] = 'новентригинтиллион' ,[ 41 ] = 'квадрагинтиллион' ,[ 51 ] = 'квинквагинтиллион' ,[ 61 ] = 'сексагинтиллион' ,[ 71 ] = 'септуагинтиллион' ,[ 81 ] = 'октогинтиллион' ,[ 91 ] = 'нонагинтиллион' ,[ 101 ] = "сантиллион" ,[ 102 ] = 'uncentilion' ,[ 103 ] = "дуоцентиллион" ,[ 104 ] = 'тресцентиллион' ,[ 111 ] = "децицентиллион" ,[ 112 ] = 'ундецициентиллион' ,[ 121 ] = 'viginticentillion' ,[ 122 ] = 'unviginticentillion' ,[ 131 ] = 'трицинтацентиллион' ,[ 141 ] = 'quadragintacentillion' ,[ 151 ] = 'quinquagintacentillion' ,[ 161 ] = 'sexagintacentillion' ,[ 171 ] = 'septuagintacentillion' ,[ 181 ] = 'octogintacentillion' ,[ 191 ] = 'nonagintacentillion' ,[ 201 ] = 'дюцентиллион' ,[ 301 ] = "трехцентиллион" ,[ 401 ] = "квадрингентиллион" ,[ 501 ] = 'квингентиллион' ,[ 601 ] = 'сесцентиллион' ,[ 701 ] = 'септингентиллион' ,[ 801 ] = 'действующийентиллион' ,[ 901 ] = "негентиллион" ,[ 1001 ] = "миллион" ,}local roman_numerals = {I = 1 ,V = 5 ,Х = 10 ,L = 50 ,С = 100 ,D = 500 ,M = 1000}local eng_lt20 = {[ 'zeroth' ] = 0 ,[ 'first' ] = 1 ,[ 'second' ] = 2 ,[ 'третий' ] = 3 ,[ 'четвертый' ] = 4 ,[ 'пятый' ] = 5 ,[ 'шестой' ] = 6 ,[ 'седьмой' ] = 7 ,[ 'восьмой' ] = 8 ,[ 'девятый' ] = 9 ,[ 'десятый' ] = 10 ,[ 'одиннадцатый' ] = 11 ,[ 'двенадцатый' ] = 12 ,[ 'тринадцатый' ] = 13 ,[ 'четырнадцатый' ] = 14 ,[ 'пятнадцатый' ] = 15 ,[ 'шестнадцатый' ] = 16 ,[ 'семнадцатый' ] = 17 ,[ 'восемнадцатый' ] = 18 ,[ 'девятнадцатый' ] = 19 ,}local eng_tens_end = {[ 'двадцатый' ] = 20 ,[ 'thirtieth' ] = 30 ,[ 'fortieth' ] = 40 ,[ 'пятидесятый' ] = 50 ,[ 'sixtieth' ] = 60 ,[ 'seventieth' ] = 70 ,[ 'восьмидесятый' ] = 80 ,[ 'девяностый' ] = 90 ,}local eng_tens_cont = {[ 'двадцать' ] = 20 ,[ 'тридцать' ] = 30 ,[ '40' ] = 40 ,[ 'пятьдесят' ] = 50 ,[ 'шестьдесят' ] = 60 ,[ 'семьдесят' ] = 70 ,[ 'восемьдесят' ] = 80 ,[ 'девяносто' ] = 90 ,}- Преобразует заданную действительную римскую цифру (и некоторые недопустимые римские цифры) в число. Возвращает -1, строка ошибки при ошибкелокальная функция roman_to_numeral ( римский )если тип ( латинское ) ~ = "строка", то возврат - 1 , "римская цифра, а не строка" конецместный rev = roman : reverse ()местное повышение = правдаместный последний = 0локальный результат = 0для i = 1 , # rev doместный c = rev : sub ( i , i )local next = римские_числа [ c ]если next == nil, тогда return - 1 , «римская цифра содержит недопустимый символ» .. c endесли следующий > последний торезультат = результат + следующийповышение = правдаelseif next < last thenрезультат = результат - следующийповышение = ложьelseif поднимать тогдарезультат = результат + следующийещерезультат = результат - следующийконецпоследний = следующийконецвернуть результатконец- Преобразует заданное целое число от 0 до 100 в английский текст (например, 47 -> сорок семь).локальная функция numeral_to_english_less_100 ( Num , порядковый номер , множественное число , нуль )local terminal_ones , terminal_tensесли порядковый, тоterminal_ones = ones_position_ordterminal_tens = tens_position_ordиначе, если множественное число, тоterminal_ones = ones_position_pluralterminal_tens = tens_position_pluralещеterminal_ones = ones_positionterminal_tens = tens_positionконецесли num == 0 и ноль ~ = nil, товернуть нольelseif num < 20 тогдаreturn terminal_ones [ число ]elseif num % 10 == 0 тогдаreturn terminal_tens [ число / 10 ]ещеreturn tens_position [ math.floor ( num / 10 )] .. '-' .. terminal_ones [ число % 10 ]конецконецлокальная функция standard_suffix ( порядковое , множественное число )если порядковый, то верните конец 'th' если множественное число, то верните конец 's' вернуться ''конец- Преобразует заданное целое число (в строковой форме) от 0 до 1000 в английский текст (например, 47 -> сорок семь)локальная функция numeral_to_english_less_1000 ( num , use_and , ordinal , множественное число , ноль )Num = ToNumber ( Num )если число < 100, тоВозвращение numeral_to_english_less_100 ( Num , порядковый номер , множественное число , нуль )elseif num % 100 == 0 тогдавернуть ones_position [ число / 100 ] .. 'сто' .. стандартный_суффикс ( порядковый , множественное число )ещевернуть ones_position [ Math.floor ( Num / 100 )] .. 'сто' .. ( use_and и 'и' или '' ) .. numeral_to_english_less_100 ( Num % 100 , порядковый номер , множественное число , нуль )конецконец- Преобразует порядковый номер в английском тексте между 'нулевым' и 'девяносто девятым' в число [0–99], иначе -1.локальная функция english_to_ordinal ( английский )local eng = string.lower ( английский или '' )местный eng_lt20 = eng_lt20местный eng_tens_end = eng_tens_endместный eng_tens_cont = eng_tens_contесли eng_lt20 [ eng ], тоreturn eng_lt20 [ eng ] --eg first -> 1elseif eng_tens_end [ eng ] тогдаreturn eng_tens_end [ eng ] --eg девяносто -> 90ещеместные десятки , единицы = string.match ( eng , '^ ([az] +)% - ([az] +) $' )если десятки и единицы, томестный tens_cont = eng_tens_cont [ десятки ]местные ones_end = eng_lt20 [ единицы ]если tens_cont и ones_end, тоreturn tens_cont + ones_end --eg девяносто девятая -> 99конецконецконецвозврат - 1 - неудачноконец- Преобразует число, выраженное в виде строки в экспоненциальном представлении, в строку в стандартном десятичном представлении.- например, 1.23E5 -> 123000, 1.23E-5 = .0000123. Преобразование точное, округление не производится.локальная функция Scientific_notation_to_decimal ( число )локальная экспонента , subs = num : gsub ( "^% -?% d *%.?% d *% -? [Ee] ([+% -]?% d +) $" , "% 1" )если subs == 0, тогда return num end - ввод не в экспоненциальной нотации, просто возврат без измененийпоказатель = ToNumber ( показатель )местный негативный = число : найти ( "^% -" )local _ , decimal_pos = число : найти ( "%." )- Мантисса будет состоять из всех десятичных цифр без десятичной точки.local mantissa = num : gsub ( "^% -? (% d *)%.? (% d *)% -? [Ee] [+% -]?% d + $" , "% 1% 2" )если отрицательное и decimal_pos, тогда decimal_pos = decimal_pos - 1 конецесли не decimal_pos, то decimal_pos = # мантисса + 1 конец- Удалите ведущие нули, если десятичная точка не находится в первой позициив то время как decimal_pos > 1 и мантисса : sub ( 1 , 1 ) == '0' делатьмантисса = мантисса : суб ( 2 )decimal_pos = decimal_pos - 1конец- Сдвиг десятичной точки вправо для экспоненты> 0в то время как экспонента > 0 сделатьdecimal_pos = decimal_pos + 1экспонента = показатель - 1если decimal_pos > # мантисса + 1, то мантисса = мантисса .. '0' конец- Удалите ведущие нули, если десятичная точка не находится в первой позициив то время как decimal_pos > 1 и мантисса : sub ( 1 , 1 ) == '0' делатьмантисса = мантисса : суб ( 2 )decimal_pos = decimal_pos - 1конецконец- Сдвиг десятичной точки влево для экспоненты <0пока показатель < 0 делатьесли decimal_pos == 1, томантисса = '0' .. мантиссаещеdecimal_pos = decimal_pos - 1конецпоказатель степени = показатель степени + 1конец- Вставьте десятичную запятую в правильное положение и вернитеreturn ( отрицательное значение и '-' или '' ) .. мантисса : sub ( 1 , decimal_pos - 1 ) .. '.'. .. мантисса : sub ( decimal_pos )конец- Округляет число до ближайшего целого (НЕ ИСПОЛЬЗУЕТСЯ)локальная функция round_num ( x )если x % 1 > = 0,5, товернуть math.ceil ( x )ещевернуть math.floor ( x )конецконец- Округляет число до ближайшего числа из двух слов (округление = вверх, вниз или «вкл» для округления до ближайшего)- Числа с двумя цифрами перед десятичной дробью будут округлены до целого числа в соответствии с параметром round.- Большие числа будут округляться до числа, у которого впереди будет только одна ненулевая цифра, а все остальные цифры будут нулевыми.- Отрицательный знак сохраняется и не учитывается при подсчете количества слов.локальная функция round_for_english ( число , раунд )- Если целое число состоит не более чем из двух цифр, просто вернитеесли Num : находка ( "? ^% -% d% d% $?.?" ) , то вернуть Num конецместный негативный = число : найти ( "^% -" )если отрицательный, то- Мы округляем величину, так что перевернитеif round == 'up' then round = 'down' else if round == 'down' then round = 'up' конецконец- Если до десятичной дроби не более двух цифр, округлить до целого и вернутьlocal _ , _ , small_int , trailing_digits , round_digit = num : find ( "^% -? (% d?% d?)%. ((% d)% d *) $" )если small_int, тоесли small_int == '' тогда small_int = '0' конецif ( round == 'up' и trailing_digits : find ( '[1-9]' )) или ( round == 'on' и tonumber ( round_digit ) > = 5 ), тоsmall_int = tostring ( tonumber ( small_int ) + 1 )конецreturn ( отрицательное и '-' или '' ) .. small_intконец- При округлении в большую сторону любое число с> 1 ненулевой цифрой будет округлено в большую сторону (например, 1000000.001 округляется до 2000000).локальные nonzero_digits = 0для цифры в num : gfind ( "[1-9]" ) делатьnonzero_digits = nonzero_digits + 1конецnum = num : gsub ( "%.% d * $" , "" ) - удалить десятичную часть- Вторая цифра, используемая для определения способа округления ведущей цифрыlocal _ , _ , lead_digit , round_digit , round_digit_2 , rest = num : find ( "^% -? (% d) (% d) (% d) (% d *) $" )если ToNumber ( lead_digit .. round_digit ) < 20 и ( 1 + # остальное ) % 3 == 0 , то- В английском языке числа <20 - это одно слово, поэтому ставьте 2 цифры в начале и в круге, исходя из 3-го числа.lead_digit = lead_digit .. round_digitround_digit = round_digit_2ещеrest = round_digit_2 .. отдыхконецif ( round == 'up' и nonzero_digits > 1 ) or ( round == 'on' и tonumber ( round_digit ) > = 5 ), тоlead_digit = tostring ( tonumber ( lead_digit ) + 1 )конец- Все цифры, кроме первой, обнулятсяrest = rest : gsub ( "% d" , "0" )return ( отрицательное значение и '-' или '' ) .. lead_digit .. '0' .. restконецместные знаменатели = {[ 2 ] = { 'half' , plural = 'halves' },[ 3 ] = { 'третий' },[ 4 ] = { 'четверть' , us = 'четвертая' },[ 5 ] = { 'пятый' },[ 6 ] = { 'шестой' },[ 8 ] = { 'восьмой' },[ 9 ] = { 'девятый' },[ 10 ] = { 'десятый' },[ 16 ] = { 'шестнадцатый' },}- Статус возврата, дробь где:- статус - строка:- «закончено», если есть дробь без целого числа;- «ок», если дробь пустая или действительная;- «неподдерживаемый», если дробь плохая;- дробь - это строка, указывающая (числитель / знаменатель) в виде текста на английском языке, или "".- Поддерживаются только беззнаковые дроби с очень ограниченным диапазоном значений,- за исключением того, что если целое пусто, числитель может использовать знак «-» для обозначения отрицательного числа.- целое (строка или ноль): ноль или "", если перед дробью нет числа- числитель (строка или ноль): числитель, если есть (по умолчанию = 1, если указан знаменатель)- знаменатель (строка или ноль): знаменатель, если есть- sp_us (логическое значение): истина, если sp = us- negative_word (string): слово для обозначения отрицательного знака, если целое пусто- use_one (boolean): false: 2 + 1/2 → «два с половиной»; правда: "два с половиной"локальная функция fraction_to_english ( целое , числитель , знаменатель , sp_us , negative_word , use_one )если числитель или знаменатель, томестное завершение = ( целое == ноль или целое == '' )местный знак = ''если числитель, тоесли закончено и числитель : sub ( 1 , 1 ) == '-' тогдачислитель = числитель : суб ( 2 )знак = отрицательное_слово .. ''конецещечислитель = '1'конецесли не числитель : совпадение ( '^% d + $' ) или не знаменатель, или не знаменатель : совпадение ( '^% d + $' ), товернуть "неподдерживаемый" , ""конецЧислитель = ToNumber ( числитель )знаменатель = ToNumber ( знаменатель )местные дендата = знаменатели [ знаменатель ]если нет ( дендата и 1 <= числитель и числитель <= 99 ), товернуть "неподдерживаемый" , ""конецместный номер , denstrместный sep = '-'если числитель == 1, тоdenstr = sp_us и dendata . нас или дендата [ 1 ]если закончено или use_one тогдаnumstr = 'один'elseif denstr : match ( '^ [aeiou]' ) затемnumstr = 'an'sep = ''ещеnumstr = 'а'sep = ''конецещеnumstr = numeral_to_english_less_100 ( числитель )denstr = дендата . множественное числоесли не denstr тоdenstr = ( sp_us и dendata . us или dendata [ 1 ]) .. 's'конецконецесли закончить тоВозвращение 'законченные' , знак .. NumStr .. Сентябрь .. denstrконецвернуть 'ok' , 'и' .. numstr .. sep .. denstrконецверните 'ок' , ''конец- Принимает десятичное число и преобразует его в английский текст.- Вернуть ноль, если дробь не может быть преобразована (для дробей поддерживаются только некоторые числа).- num (строка или nil): число для преобразования.- Может быть произвольно большим десятичным числом, например "-123456789123456789,345" и- можно использовать научную нотацию (например, «1.23E5»).- Может завершиться ошибкой для очень больших номеров, не перечисленных в «группах», таких как «1E4000».- num равно нулю, если перед дробью нет целого числа.- числитель (строка или ноль): числитель дроби (ноль, если дроби нет)- знаменатель (строка или ноль): знаменатель дроби (ноль, если дроби нет)- capitalize (boolean): использовать ли результат с большой буквы (например, «One» вместо «one»)- use_and (boolean): использовать ли слово 'and' между десятками / единицами и более высокими разрядами- дефис (логический): переносить ли все слова в результате через дефис, полезно для использования в качестве прилагательного- порядковый (логический): следует ли производить порядковый номер (например, «первый» вместо «один»)- множественное число (логическое): следует ли использовать во множественном числе получившееся число- links: nil: не добавлять ссылки; 'on': ссылка «миллиард» и более на статью «Порядок величин»;- любой другой текст: список номеров для ссылки (например, «миллиард, квадриллион»)- negative_word: слово для обозначения отрицательного знака (обычно «отрицательный» или «минус»; ноль для использования по умолчанию)- round: ноль или '': без округления; 'on': округлить до ближайшего двухсловного числа; 'вверх' / 'вниз': округлить вверх / вниз до числа, состоящего из двух слов- ноль: слово для значения '0' (ноль для использования по умолчанию)- use_one (boolean): false: 2 + 1/2 → «два с половиной»; правда: "два с половиной"локальная функция _numeral_to_english ( число , числитель , знаменатель , использовать заглавные буквы , использовать_и , дефис , порядковый номер , множественное число , ссылки , отрицательное_слово , округление , ноль , использовать_один )если не negative_word, тоесли use_and затем- ЗАДАЧИ Следует ли использовать «минус», когда sp = us нет?- Если да, то нужно обновить тесткейсы и исправить «минус ноль».- negative_word = 'минус'отрицательное_слово = 'отрицательное'ещеотрицательное_слово = 'отрицательное'конецконецместный статус , fraction_text = fraction_to_english ( Num , числитель , знаменатель , не use_and , negative_word , use_one )если status == 'неподдерживаемый', товернуть нольконецесли status == 'завершено', то- Введите дробь без целого числа.- Взломайте, чтобы не запускать вещи, которые зависят от числа, являющегося числом.местный s = дробный_текстесли дефис, то s = s : gsub ( "% s" , "-" ) endесли использовать заглавные буквы, то s = s : gsub ( "^% l" , string.upper ) endвернуть sконецNum = scientific_notation_to_decimal ( Num )если круглые и круглые ~ = '', тоесли round ~ = 'on' и round ~ = 'up' и round ~ = 'down', тогдаerror ( «Недопустимый режим округления» )конецnum = round_for_english ( число ; округление )конец- Разделить на знак минус, num (цифры до десятичной дроби), decimal_places (цифры после десятичной дроби)local MINUS = '-' - Unicode U + 2212 MINUS SIGN (может быть в значениях из [[Module: Convert]])если num : sub ( 1 , # MINUS ) == MINUS, тоnum = '-' .. num : sub ( # MINUS + 1 ) - заменить MINUS на '-'elseif num : sub ( 1 , 1 ) == '+', затемnum = num : sub ( 2 ) - игнорировать любой '+'конецместный негативный = число : найти ( "^% -" )local decimal_places , subs = num : gsub ( "^% -?% d *%. (% d +) $" , "% 1" )если subs == 0, то decimal_places = nil endnum , subs = num : gsub ( "^% -? (% d *)%.?% d * $" , "% 1" )если num == '' и decimal_places, то num = '0' конецесли subs == 0 или num == '', то ошибка ( "Недействительное десятичное число" ) end- Для каждой группы из 3 цифр, кроме последней, выведите соответствующее название группы (например, миллион).местный s = ''пока # num > 3 сделатьесли s ~ = '' то s = s .. '' конецlocal group_num = math.floor (( # число - 1 ) / 3 )локальная группа = группы [ group_num ]local group_digits = # число - номер_группы * 3s = s .. numeral_to_english_less_1000 ( num : sub ( 1 , group_digits ), false , false , false , zero ) .. ''если ссылки и ((( links == 'on' and group_num > = 3 ) or links : find ( group )) and group_num <= 13 ), тоs = s .. '[[Orders_magnitude_ (числа) # 10' .. group_num * 3 .. '|' .. группа .. ']]'ещеs = s .. группаконецчисло = число : sub ( 1 + group_digits )num = num : gsub ( "^ 0 *" , "" ) - обрезать ведущие нуликонец- Обрабатывать последние три цифры целой частиесли s ~ = '' и num ~ = '', тоif # num <= 2 и use_and затемs = s .. 'и'ещес = с .. ''конецконецесли s == '' или num ~ = '', тоs = s .. numeral_to_english_less_1000 ( число , use_and , порядковый , множественное число , ноль )ElseIf порядкового или множественное число , то- Круглые числа, такие как "один миллион", принимают стандартные суффиксы для порядкового / множественного числа.s = s .. стандартный_суффикс ( порядковое , множественное число )конец- Для десятичных знаков (если есть) выведите «точку» с последующим написанием цифр за цифрой.если decimal_places, тоs = s .. 'точка'для i = 1 , # decimal_places делаютs = s .. '' .. ones_position [ tonumber ( decimal_places : sub ( i , i ))]конецконецs = s : gsub ( "^% s * (.-)% s * $" , "% 1" ) - Обрезать пробелыесли порядковое и множественное число, то s = s .. 's' end - суффикс s работает для всех порядковых номеровесли отрицательное и s ~ = ноль, то s = отрицательное_слово .. '' .. s конецs = s : gsub ( «отрицательный ноль» , «ноль» )s = s .. дробный_текстесли дефис, то s = s : gsub ( "% s" , "-" ) endесли использовать заглавные буквы, то s = s : gsub ( "^% l" , string.upper ) endвернуть sконецлокальная функция _numeral_to_english2 ( аргументы )местное число = аргументы . числоесли ( не ToNumber ( Num )) , тоnum = num : gsub ( "^% s * (.-)% s * $" , "% 1" ) - обрезать пробелыnum = num : gsub ( "," , "" ) - удалить запятыеnum = num : gsub ( "^ <span [^ <>] *> </span>" , "" ) - Создано с помощью шаблона: ageесли num ~ = '' тогда - дробь может иметь пустое целое числоесли не num : find ( "^% -?% d *%.?% d *% -? [Ee]? [+% -]?% d * $" ), то- Введите неверный формат, попробуйте передать его через #expr, чтобы увидеть- если это дает число (например, «3 + 5» превратится в «8»).число = mw . getCurrentFrame (): препроцесс ( '{{#expr:' .. число .. '}}' )конецконецконец- Передача аргументов из кадра в вспомогательную функциюreturn _numeral_to_english (число ,args [ 'числитель' ],args [ 'знаменатель' ],args [ 'заглавными буквами' ],аргументы [ 'use_and' ],args [ 'дефис' ],args [ 'порядковый номер' ],args [ 'множественное число ],args [ 'ссылки' ],аргументы [ 'отрицательное_слово' ],args [ 'круглый' ],args [ 'ноль' ],аргументы [ 'use_one' ]) или ''конецlocal p = { - Функции, которые могут быть вызваны из другого модуляroman_to_numeral = roman_to_numeral ,spell_number = _numeral_to_english ,spell_number2 = _numeral_to_english2 ,english_to_ordinal = english_to_ordinal ,}функция p . _roman_to_numeral ( кадр ) - вызывается через {{#invoke: ConvertNumeric | _roman_to_numeral | VI}}вернуть roman_to_numeral ( frame . args [ 1 ])конецфункция p . _english_to_ordinal ( frame ) - вызывается через {{#invoke: ConvertNumeric | _english_to_ordinal | First}}return english_to_ordinal ( frame . args [ 1 ])конецфункция p . numeral_to_english ( рамка )локальные аргументы = фрейм . аргументыlocal num = args [ 1 ]num = num : gsub ( "^% s * (.-)% s * $" , "% 1" ) - обрезать пробелыnum = num : gsub ( "," , "" ) - удалить запятыеnum = num : gsub ( "^ <span [^ <>] *> </span>" , "" ) - Создано с помощью шаблона: ageесли num ~ = '' тогда - дробь может иметь пустое целое числоесли не num : find ( "^% -?% d *%.?% d *% -? [Ee]? [+% -]?% d * $" ), то- Введите неверный формат, попробуйте передать его через #expr, чтобы увидеть- если это дает число (например, «3 + 5» превратится в «8»).число = кадр : препроцесс ( '{{# выражение:' .. число .. '}}' )конецконец- Передача аргументов из кадра в вспомогательную функциюreturn _numeral_to_english (число ,args [ 'числитель' ],args [ 'знаменатель' ],args [ 'case' ] == 'U' или args [ 'case' ] == 'u' ,args [ 'sp' ] ~ = 'нас' ,args [ 'adj' ] == 'on' ,args [ 'ord' ] == ' вкл ' ,args [ 'pl' ] == 'on' ,аргументы [ 'lk' ],args [ 'отрицательный' ],args [ 'круглый' ],args [ 'ноль' ],args [ 'one' ] == 'one' - эксперимент: использование '| one = one' заставляет дробь 2 + 1/2 давать «два с половиной» вместо «два с половиной») или ''конец---- рекурсивная функция для p.decToHexлокальная функция decToHexDigit ( dec )local dig = { "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "A" , "B" " , " C " , " D " , " E " , " F " }местный div = math.floor ( dec / 16 )локальный мод = dec - ( 16 * div )если div > = 1, то вернуть decToHexDigit ( div ) .. dig [ mod + 1 ] иначе вернуть dig [ mod + 1 ] endконец - я думаю, что это должно быть сделано с помощью хвостового вызова, но сначала я хочу что-то, что вообще работает---- находит все десятичные числа во входном тексте и обрабатывает каждое из нихфункция p . decToHex ( фрейм )локальные аргументы = фрейм . аргументылокальный родитель = фрейм . getParent ( кадр )local pargs = {}если родитель, то pargs = parent . конец аргументов локальный текст = args [ 1 ] или pargs [ 1 ] или ""локальная минимальная длина = аргументы . minlength или pargs . minlength или 1MinLength = ToNumber ( MinLength )местный prowl = mw . ustring . gmatch ( текст , "(.-) (% d +)" )локальный выход = ""повторениеместная мякина , dec = prowl ()если нет ( уб ), то перерыв конецместное шестнадцатеричное = decToHexDigit ( dec )while ( mw . ustring . len ( hex ) < minlength ) do hex = "0" .. конец шестнадцатеричного output = output .. chaff .. hexпока ложьместная мякина = mw . ustring . совпадение ( текст , "(% D +) $" ) или ""возвратный выход .. мякинаконецвернуть p