Постоянно защищенный модуль
Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Документация по модулю [ просмотреть ] [ изменить ] [ историю ] [ очистить ]

использование

{{#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