--[[ 이 모듈은 아라비아 숫자를 로마 숫자로 변환합니다. 현재 50억 미만의 음이 아닌 정수(최대 499999999)에 대해 작동합니다. 0은 표준 CLDR 데이터와 같이 "N"으로 표시됩니다(고전 라틴어 부사 "nec" 또는 "non"에서). 4000으로 시작하는 숫자의 경우 이 버전에서는 HTML+CSS가 생성되지 않고 일반 텍스트만 생성됩니다. 표준 Unicode 조합의 분음 부호는 오버라인에 사용됩니다(첫 번째 레벨의 경우 U+0305). U+0304는 두 번째 레벨이지만 로마 번호를 해석할 때는 둘 다 동등하게 취급됩니다). 40억으로 시작하는 숫자의 경우, 두 개의 오버라인을 가진 4개의 문자 M을 사용합니다. 트리플 오버라인은 일반 텍스트에서는 지원되지 않습니다('MMM'도 마찬가지입니다). 4000을 나타내는 것은 허용되지만 이 버전에서는 단일 오버라인을 가진 짧은 "IV"를 선택합니다). 로마 번호 파서는 모든 유효한 표기를 받아들입니다(아포스트로피컬/클라우디아/런네이트 표기는 제외). 역방향 C)를 사용하여 생성되는 값보다 많으며 아랍 숫자로 올바르게 변환됩니다. 모듈에서 변경 사항을 먼저 적용하지 않고 이 코드를 수정하지 마십시오.로마/샌드박스 및 테스트 모듈:로마/샌드박스/테스트케이스 및 모듈 토크:로마/샌드박스/테스트케이스. 작성자 및 유지관리자: * 사용자: RP88, 사용자:Verdy_p ]] 현지의 p = {} --[============[ 개인 데이터 --]============] -- "roman-uper" 규칙에 대해서는 CLDR data /common/rbnf/root.xml 을 참조하십시오.하지만 우리는 여전히 그렇지 않다. -- 'M' 뒤에 거의 지원되지 않는 로마자 내선번호를 사용합니다(U+2160의 경우).2188) 단, 사용 -- 분음 오버라인('v'='V'), 'v'='X' 등)이 있는 일반적인 표기법입니다. -- "text-decoration: overline" 스타일과 함께 HTML을 사용하는 것은 피하되 일반 텍스트를 사용하십시오. -- 문자(U+0304 및/또는 U+0305)를 조합합니다. 현지의 10진수 로마인 = { d0 = { [0] = '', '나', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VII', 'IX' }, d1 = { [0] = '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC' }, d2 = { [0] = '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', DCC, DCCC, 'CM' }, d3 = { [0] = '', 'M', 'MM', 'MM', 'I'V', '브이', 'V'I', 'V'I'I', 'V'I'I'I', 'I'X' }, d4 = { [0] = '', 'XX', 'XXX', 'XXX', 'X'L', 'L'', 'L'X', 'L'X'X', 'L'X'X', 'X'C' }, d5 = { [0] = '', 'C', 'C'C', 'C'C', 'C'D', 'D', 'D'C', 'D'C'C', 'D'C'C', 'C'M' }, d6 = { [0] = '', 'M'', 'M'M', 'M'M', 'I'V', '브이', 'V'I', 'V'I'I', 'V'I'I'I', 'I'X' }, d7 = { [0] = '', 'XX', 'XXX', 'XXX', 'X'L', 'L'', 'L'X', 'L'X'X', 'L'X'X', 'X'C' }, d8 = { [0] = '', 'C', 'C'C', 'C'C', 'C'D', 'D', 'D'C', 'D'C'C', 'D'C'C', 'C'M' }, d9 = { [0] = '', 'M'', 'M'M', 'M'M', 'M'M'M'M'M'M' }, } 현지의 로마십진수 = { -- 기본 라틴 대문자 N = 0, -- 고전 라틴어에서는 "nec" 또는 "non" 부사를 생략한다. I = 1, V = 5, X = 10, L = 50, C = 100, D = 500,-- TODO: "I"와 같은 중세 "아포스트로피컬/클라우디아/루네이트" 표기를 추가합니다. M = 1000, - 기본 라틴어 작은 글자(고전 라틴어에서는 사용되지 않지만 중세 라틴어에서는 추가됨) n = 0, -- 고전 라틴어에서는 "nec" 또는 "non" 부사를 생략한다. i = 1, v = 5, x = 10, l = 50, c = 100, d = 500,-- TODO: "I"와 같은 중세 "아포스트로피컬/클라우디아/루네이트" 표기를 추가합니다. m = 1000, -- U+0304 ..U+0305 : 결합(MACRON 오버라인) ['\204\132'] = -1000, -- (0xCC, UTF-8의 경우 0x84) 승수(천) ['\204\133'] = -1000, -- (UTF-8에서는 0xCC, UTF-8에서는 0x85)승수(천)는 여기서 동등하다고 간주됩니다. -- U+033F : 더블 오버라인 결합 ['\204\191'] = -1000000, -- (UTF-8에서는 0xCC, 0xBF) 승수(백만) -- U+012a ['ī'] = 1000, ['실패'] = 1000, ­ 'I'와 U+0304에 해당하는 마크롱을 조합한 라틴 문자 -- U+2160..U+216F : 로마자 대문자 숫자 기호(호환성, CJK 글꼴로 구분) ['Ⅰ'] = 1, ['Ⅱ'] = 2, ['Ⅲ'] = 3, ['Ⅳ'] = 4, ['Ⅴ'] = 5, ['Ⅵ'] = 6, ['Ⅶ'] = 7, ['Ⅷ'] = 8, ['Ⅸ'] = 9, ['Ⅹ'] = 10, ['Ⅺ'] = 11, ['Ⅻ'] = 12, ['Ⅼ'] = 50, ['Ⅽ'] = 100, ['Ⅾ'] = 500, ['Ⅿ'] = 1000, -- U+2170..U+217F : 로마자 소문자 기호(호환성, CJK 글꼴로 구분) ['ⅰ'] = 1, ['ⅱ'] = 2, ['ⅲ'] = 3, ['ⅳ'] = 4, ['ⅴ'] = 5, ['ⅵ'] = 6, ['ⅶ'] = 7, ['ⅷ'] = 8, ['ⅸ'] = 9, ['ⅹ'] = 10, ['ⅺ'] = 11, ['ⅻ'] = 12, ['ⅼ'] = 50, ['ⅽ'] = 100, ['ⅾ'] = 500, ['ⅿ'] = 1000, -- U+2180..U+2182 : 고대 로마 기호(대소문자 쌍 없음) ['ↀ'] = 1000, -- = 'I' = 'M'. TODO: "CI'와 같은 중세 "아포스트로피컬/클라우디아/룬산" 표기 추가; "CD"와 혼동하지 마십시오(400) ['ↁ'] = 5000, -- = 'V'입니다.TODO: "D" 및 "I"와 같은 중세 "Apostrophic/Claudian/lunate" 표기를 추가합니다. ['ↂ'] = 10000, -- = 'XXX'TODO: CCI " " " " " " " " " " " " " " " " 중세 표기 추가 -- U+2183..U+2184 : ROMAN DIGIT (대문자 소문자)역C.TODO: "apostrophic/Claudian/lunate" 표기에 추가(및 ")" OPEN O를 에일리어스로 지원) -- 역방향 "C"는 10의 후행 승수이지만 선행 "C"에 의해 쌍을 이루지 않으면 주변 값은 2로 나뉩니다. -- * "I" = 1이지만 뒤에 "δ"가 이어지는 경우 100: -- * 뒤에 첫 번째 "Ω"이 붙으면 10에 1000을 곱하지만, 쌍 "C"가 붙지 않으면 "IΩ" = "D"에 500을 곱합니다. -- * 뒤에 두 번째 "Ω"이 붙으면 10에 1000을 곱하지만, 쌍 "C"가 붙지 않으면 "IΩ" = "DΩ"에 5000을 곱합니다. -- * 높은 배수의 경우, 1000의 승수를 주목하기 위해 오버라인을 사용하는 것이 매우 선호됩니다. -- U+2185: 로마 숫자 6 후기 형식 ['ↅ'] = 6, -- = 'VI'(중복된 문자) -- U+2186: ROMAN NUMERAL FIFY EARY FORTY FORTY FORY FORTY FORY FORY FORTY FORY FORY FORTY 형식(그리스어 파이널 시그마에서 라틴어로 빌려온 것으로, 다리가 '반'인 'C'와 유사함) ['ↆ'] = 50, -- = 'L' -- U+2187..U+2188: 로마숫자 (150) THANT (아키텍어, 글꼴은 거의 지원되지 않음) ['ↇ'] = 50000, -- = 'L'입니다.TODO: "D" 및 "I"와 같은 중세 "Apostrophic/Claudian/lunate" 표기를 추가합니다. ['ↈ'] = 100000, -- = 'C'입니다.TODO: "CCCD" 및 "CCI"와 같은 중세 "아포스트로피컬/클라우디아/루네이트" 표기 추가 } --[=================[ 개인 기능 --]=================] --[==[ 이 함수는 로마 숫자로 포맷된 입력 값을 포함하는 문자열을 반환합니다. 50억 미만의 음수가 아닌 정수(최대 4999999999: 이 내용 포함)에 대해 작동합니다. 부호 없는 32비트 정수 모두)를 지정하지 않으면 라틴어로 포맷된 숫자를 반환합니다. digits. 결과 문자열은 UTF-8로 인코딩된 보통 텍스트 알파벳 문자열이 됩니다. ]==]-- 현지의 기능. 아랍어 토로만 변환(가치) 한다면 가치 >= 1 그리고. 가치 <=> 4999999999 그리고. 가치 == math.floor(가치) 그리고나서 현지의 d0, d1, d2, d3, d4, d5, d6, d7, d8 d0, 가치 = 가치 % 10, math.floor(가치 / 10) d1, 가치 = 가치 % 10, math.floor(가치 / 10) d2, 가치 = 가치 % 10, math.floor(가치 / 10) d3, 가치 = 가치 % 10, math.floor(가치 / 10) d4, 가치 = 가치 % 10, math.floor(가치 / 10) d5, 가치 = 가치 % 10, math.floor(가치 / 10) d6, 가치 = 가치 % 10, math.floor(가치 / 10) d7, 가치 = 가치 % 10, math.floor(가치 / 10) d8, 가치 = 가치 % 10, math.floor(가치 / 10) 돌아가다 table.concat({ 10진수 로마인.d9[가치], 10진수 로마인.d8[d8], 10진수 로마인.d7[d7], 10진수 로마인.d6[d6], 10진수 로마인.d5[d5], 10진수 로마인.d4[d4], 10진수 로마인.d3[d3], 10진수 로마인.d2[d2], 10진수 로마인.d1[d1], 10진수 로마인.d0[d0], }) 그렇지 않으면 가치 == 0 그리고나서 돌아가다 'N' -- 고전 라틴어(제로 없음)의 'nec' 또는 'non' 부사의 경우 끝. 돌아가다 스트링(가치) 끝. --[==[ 이 함수는 로마 숫자를 포함하는 일반 텍스트 문자열을 정수로 변환합니다. 0(N)~4999999(M'M'C'M'X'C)의 값으로 동작합니다.I'X'C'M'X'C'I'X'CMXCIX) ]==]-- 현지의 기능. Roman-To-Arabic 변환(로만) 한다면 로만 == '' 그리고나서 돌아가다 제로 끝. 현지의 결과, 10진수 이전, 승수 = 0, 0, 1 위해서 i = 음.스트링.렌(로만), 1, -1 하다 현지의 현재 Roman Decimal = 로마십진수[음.스트링.후보선수(로만, i, i)] 한다면 현재 Roman Decimal == 제로 그리고나서 돌아가다 제로 그렇지 않으면 현재 Roman Decimal < > 0 그리고나서 승수 = 승수 * -현재 Roman Decimal 또 다른 현재 Roman Decimal, 승수 = 현재 Roman Decimal * 승수, 1 한다면 현재 Roman Decimal < > 10진수 이전 그리고나서 결과 = 결과 - 현재 Roman Decimal 또 다른 결과 = 결과 + 현재 Roman Decimal 10진수 이전 = 현재 Roman Decimal 끝. 끝. 끝. 돌아가다 결과 끝. --[==[ 이 함수는 로마 숫자를 포함하는 문자열을 정수로 변환합니다. 0 ~ 499999999 의 값으로 동작합니다. 입력 문자열에는 style="text-decoration:overline"을 사용하는 HTML 태그가 포함될 수 있습니다(권장되지 않음). ]==]-- 현지의 기능. 개종한 로마인HTMLToArabic(로만) 현지의 결과 = Roman-To-Arabic 변환(로만) 한다면 결과 == 제로 그리고나서 결과 = 톤수(로만) 끝. 돌아가다 결과 [==] 현재 사용 불가, 실제로 필요하지 않으며 올바르게 테스트되지 않음 로컬 결과 = 0 local overline_start_len = mw.ustring.len(overline_start) mw.ustring.sub(roman, 1, overline_start_len) == overline_start일 경우 local end_tag_start, end_tag_end = mw.ustring.find(roman, overline_end, overline_start_len, true) end_tag_start ~=영일 경우 local roman_high = mw.ustring.sub(roman, overline_start_len + 1, end_tag_start - 1) local roman_low = mw.ustring.sub(로마, end_tag_end + 1, mw.ustring.len(로마) 또는 '' if ( mw . ustring . find ( roman _ high , " ^ [ mdclxvi ] + )$") ~ = 0) 및 (mw.ustring.find(roman_low, "^[mdclxvi]*$") ~= 0) 그럼 결과 = convertRomanToArabic (roman_high) * 1000 + convertRomanToArabic (roman_low) 끝. 끝. 끝. 반환 결과 ]==] 끝. --[==[ 오류 메시지를 처리하는 도우미 기능. ]==]-- 현지의 기능. output Error(출력 오류)(메세지) 돌아가다 table.concat({ '<strong class="error"> 로마 모듈 오류: ', 메세지, '</strong>[카테고리:Module Roman에서 보고된 오류]' }) 끝. --[================[ 공공 기능 --]================] --[==[ 로만 트리밍된 입력이 유효한 로마 숫자인지 테스트합니다.있으면 true, 없으면 false를 반환합니다. 이 기능의 목적상 빈 문자열(흰 공간을 잘라낸 후)은 로마 숫자가 아닙니다. 파라미터 s: 유효한 로마 숫자인지 여부를 테스트하는 문자열 오류 처리: 입력이 유효한 로마숫자가 아닌 경우 이 함수는 false를 반환합니다. ]==]-- 기능. p.로만(s) 돌아가다 유형(s) == '문자열 그리고. Roman-To-Arabic 변환(음.본문.다듬다(s)) ~= 제로 끝. --[==[ 아랍어 이 함수는 로마 숫자를 아랍 숫자로 변환합니다. 0 ~ 499999999 의 값으로 동작합니다. 'N'은 0으로 변환되고 빈 문자열은 0으로 변환됩니다. 파라미터 roman: 아랍 숫자로 변환할 값을 포함하는 문자열 오류 처리: 입력이 유효한 로마숫자가 아닌 경우 이 함수는 0을 반환합니다. ]==]-- 기능. p.아랍어(로만) 한다면 유형(로만) == '문자열 그리고나서 로만 = 음.본문.다듬다(로만) 현지의 결과 = Roman-To-Arabic 변환(로만) 한다면 결과 == 제로 그리고나서 결과 = 톤수(로만) 끝. 돌아가다 결과 그렇지 않으면 유형(로만) == '숫자' 그리고나서 돌아가다 로만 또 다른 돌아가다 제로 끝. 끝. --[==[ _숫자 이 함수는 로마 숫자로 포맷된 입력 값을 포함하는 문자열을 반환합니다. 0 ~ 499999999 의 값으로 동작합니다. 파라미터 값: 로마 숫자로 변환할 값을 포함하는 정수 또는 문자열 오류 처리: 입력에 번호가 포함되어 있지 않거나 번호가 외부인 경우 supported range 오류 메시지가 반환됩니다. ]==]-- 기능. p._숫자(가치) 한다면 가치 == 제로 그리고나서 돌아가다 output Error(출력 오류)('최소값') 끝. 한다면 유형(가치) == '문자열 그리고나서 가치 = 톤수(가치) 그렇지 않으면 유형(가치) ~= '숫자' 그리고나서 돌아가다 output Error(출력 오류)('지원되지 않는 값') 끝. 돌아가다 아랍어 토로만 변환(가치) 끝. --[==[ 숫자 MediaWiki의 기능은 아라비아 숫자를 로마 숫자로 변환합니다. 0 ~ 49999999(부호 없는 32비트 정수의 전체 범위 포함)의 값에 대해 동작합니다. 아라비아 숫자 0은 'N'으로 출력됩니다(라틴 부정 부사 "nec" 또는 "non"의 경우). 사용방법: {{#제외:로마숫자 <값>}} {{#제외:Roman Numeral}: 발신자 파라미터를 사용합니다. 파라미터 1: 로마 숫자로 변환할 값.0 이상 5,000,000 미만이어야 합니다. 오류 처리: 입력에 번호가 포함되어 있지 않거나 번호가 외부인 경우 supported range 오류 메시지가 반환됩니다. ]==]-- 기능. p.숫자(틀) -- 인수가 지정되지 않은 경우 부모 템플릿/인수 arg를 확인합니다. 현지의 args = 틀.args 한다면 args[1] == 제로 그리고나서 args = 틀:부모 취득().args 끝. 돌아가다 p._숫자(args[1]) 끝. 돌아가다 p