<?php
/*
|-----------------------------------------------------------------------------------------------------------------------
| Negative roman numbers?! :D - No apparent concept of negatives here.
| So we could just stick to normal negative numbers.
|-----------------------------------------------------------------------------------------------------------------------
*/
# normal negative numbers
$roman = '-x: =#,##0=;';
# "Just for fun/Unofficial" negative roman numerals
#$roman = '-x: ->>;';
/*
|-----------------------------------------------------------------------------------------------------------------------
| No concept of zero here.
| The number zero does not have its own Roman numeral, but the word nulla (the Latin word meaning "none")
| was used by medieval scholars in lieu of 0. Dionysius Exiguus was known to use nulla alongside Roman numerals
| in 525.
|
| 0: nulla
| 0: N
| The N could also be used. https://en.wikipedia.org/wiki/Roman_numerals#Zero
|-----------------------------------------------------------------------------------------------------------------------
*/
# $roman = '0: N;';
$roman .= '0: nulla;';
/*
|-----------------------------------------------------------------------------------------------------------------------
| The larger numbers
|-----------------------------------------------------------------------------------------------------------------------
*/
$roman .= <<<RULE_BASED_FORMAT
I; II; III; IV; V; VI; VII; VIII; IX;
10: X>>;
20: XX>>;
30: XXX>>;
40: XL>>;
50: L>>;
60: LX>>;
70: LXX>>;
80: LXXX>>;
90: XC>>;
100: C>>;
400: CD>>;
500: D>>;
600: DC>>;
900: CM>>;
1000: M>>;
2000: MM>>;
3000: MMM>>;
4000: MMMM>>;
RULE_BASED_FORMAT;
/*
|-----------------------------------------------------------------------------------------------------------------------
| The larger numbers
|-----------------------------------------------------------------------------------------------------------------------
*/
$roman .= <<<RULE_BASED_FORMAT
5000: V\u{0305}>>;
6000: V\u{0305}M>>;
7000: V\u{0305}MM>>;
8000: V\u{0305}MMM>>;
9000: V\u{0305}MMMM>>;
10000: X\u{0305}>>;
20000: X\u{0305}X\u{0305}>>;
30000: X\u{0305}X\u{0305}X\u{0305}>>;
40000: X\u{0305}L\u{0305}>>;
50000: L\u{0305}>>;
60000: L\u{0305}X\u{0305}>>;
70000: L\u{0305}X\u{0305}X\u{0305}>>;
80000: L\u{0305}X\u{0305}X\u{0305}X\u{0305}>>;
90000: X\u{0305}C\u{0305}>>;
100000: C\u{0305}>>;
200000: C\u{0305}C\u{0305}>>;
300000: C\u{0305}C\u{0305}C\u{0305}>>;
400000: C\u{0305}D\u{0305}>>;
500000: D\u{0305}>>;
600000: D\u{0305}C\u{0305}>>;
700000: D\u{0305}C\u{0305}C\u{0305}>>;
800000: D\u{0305}C\u{0305}C\u{0305}C\u{0305}>>;
900000: C\u{0305}M\u{0305}>>;
1000000: M\u{0305}>>;
2000000: M\u{0305}M\u{0305}>>;
3000000: M\u{0305}M\u{0305}M\u{0305}>>;
4000000: I\u{033F}V\u{033F}>>;
5000000: V\u{033F}>>;
6000000: V\u{033F}I\u{033F}>>;
7000000: V\u{033F}I\u{033F}I\u{033F}>>;
8000000: V\u{033F}I\u{033F}I\u{033F}I\u{033F}>>;
9000000: I\u{033F}X\u{033F}>>;
10000000: X\u{033F}>>;
20000000: X\u{033F}X\u{033F}>>;
30000000: X\u{033F}X\u{033F}X\u{033F}>>;
40000000: X\u{033F}L\u{033F}>>;
50000000: L\u{033F}>>;
60000000: L\u{033F}X\u{033F}>>;
70000000: L\u{033F}X\u{033F}X\u{033F}>>;
80000000: L\u{033F}X\u{033F}X\u{033F}X\u{033F}>>;
90000000: X\u{033F}C\u{033F}>>;
100000000: C\u{033F}>>;
200000000: C\u{033F}C\u{033F}>>;
300000000: C\u{033F}C\u{033F}C\u{033F}>>;
400000000: C\u{033F}D\u{033F}>>;
500000000: D\u{033F}>>;
600000000: D\u{033F}C\u{033F}>>;
700000000: D\u{033F}C\u{033F}C\u{033F}>>;
800000000: D\u{033F}C\u{033F}C\u{033F}C\u{033F}>>;
900000000: C\u{033F}M\u{033F}>>;
1000000000: M\u{033F}>>;
2000000000: M\u{033F}M\u{033F}>>;
3000000000: M\u{033F}M\u{033F}M\u{033F}>>;
4000000000: M\u{033F};M\u{033F};M\u{033F};M\u{033F}>>;
RULE_BASED_FORMAT;
/*
|-----------------------------------------------------------------------------------------------------------------------
| Then go back to normal numbers
|-----------------------------------------------------------------------------------------------------------------------
*/
$roman .= <<<RULE_BASED_FORMAT
5000000000: =#,##0=;
RULE_BASED_FORMAT;
header('Content-Type: text/html; charset=utf-8');
$fmt = new NumberFormatter('en', NumberFormatter::PATTERN_RULEBASED, $roman);
$year = $fmt->format(2014);
$game = $fmt->format(22);
echo "Year $year, $game Olympic Winter Games";
/*
|-----------------------------------------------------------------------------------------------------------------------
| Sources:
| https://en.wikipedia.org/wiki/Roman_numerals
| http://www.tuomas.salste.net/doc/roman/numeri-romani-learn.html
| https://en.wikipedia.org/wiki/1,000,000,000
| https://forbrains.co.uk/free_online_tools/convert_to_roman_numerals
| https://en.wikipedia.org/wiki/Numerals_in_Unicode#Roman_numerals_in_Unicode
| http://userguide.icu-project.org/formatparse/numbers/rbnf-examples
|
| Warning, there are more than one ways to write certain numbers, and some
| can even mean two different numbers.
|
| Example: "V̅I̅I̅I̅" can mean 80,000 or 800,000
| See https://en.wikipedia.org/wiki/Roman_numerals#Vinculum
|-----------------------------------------------------------------------------------------------------------------------
*/
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /in/mKXqg
function name: (null)
number of ops: 30
compiled vars: !0 = $roman, !1 = $fmt, !2 = $year, !3 = $game
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
9 0 E > ASSIGN !0, '-x%3A+%3D%23%2C%23%230%3D%3B'
27 1 ASSIGN_OP 8 !0, '0%3A+nulla%3B'
35 2 ASSIGN_OP 8 !0, 'I%3B+II%3B+III%3B+IV%3B+V%3B+VI%3B+VII%3B+VIII%3B+IX%3B%0A10%3A+X%3E%3E%3B%0A20%3A+XX%3E%3E%3B%0A30%3A+XXX%3E%3E%3B%0A40%3A+XL%3E%3E%3B%0A50%3A+L%3E%3E%3B%0A60%3A+LX%3E%3E%3B%0A70%3A+LXX%3E%3E%3B%0A80%3A+LXXX%3E%3E%3B%0A90%3A+XC%3E%3E%3B%0A100%3A+C%3E%3E%3B%0A400%3A+CD%3E%3E%3B%0A500%3A+D%3E%3E%3B%0A600%3A+DC%3E%3E%3B%0A900%3A+CM%3E%3E%3B%0A1000%3A+M%3E%3E%3B%0A2000%3A+MM%3E%3E%3B%0A3000%3A+MMM%3E%3E%3B%0A4000%3A+MMMM%3E%3E%3B'
62 3 ASSIGN_OP 8 !0, '5000%3A+V%CC%85%3E%3E%3B%0A6000%3A+V%CC%85M%3E%3E%3B%0A7000%3A+V%CC%85MM%3E%3E%3B%0A8000%3A+V%CC%85MMM%3E%3E%3B%0A9000%3A+V%CC%85MMMM%3E%3E%3B%0A10000%3A+X%CC%85%3E%3E%3B%0A20000%3A+X%CC%85X%CC%85%3E%3E%3B%0A30000%3A+X%CC%85X%CC%85X%CC%85%3E%3E%3B%0A40000%3A+X%CC%85L%CC%85%3E%3E%3B%0A50000%3A+L%CC%85%3E%3E%3B%0A60000%3A+L%CC%85X%CC%85%3E%3E%3B%0A70000%3A+L%CC%85X%CC%85X%CC%85%3E%3E%3B%0A80000%3A+L%CC%85X%CC%85X%CC%85X%CC%85%3E%3E%3B%0A90000%3A+X%CC%85C%CC%85%3E%3E%3B%0A100000%3A+C%CC%85%3E%3E%3B%0A200000%3A+C%CC%85C%CC%85%3E%3E%3B%0A300000%3A+C%CC%85C%CC%85C%CC%85%3E%3E%3B%0A400000%3A+C%CC%85D%CC%85%3E%3E%3B%0A500000%3A+D%CC%85%3E%3E%3B%0A600000%3A+D%CC%85C%CC%85%3E%3E%3B%0A700000%3A+D%CC%85C%CC%85C%CC%85%3E%3E%3B%0A800000%3A+D%CC%85C%CC%85C%CC%85C%CC%85%3E%3E%3B%0A900000%3A+C%CC%85M%CC%85%3E%3E%3B%0A1000000%3A+M%CC%85%3E%3E%3B%0A2000000%3A+M%CC%85M%CC%85%3E%3E%3B%0A3000000%3A+M%CC%85M%CC%85M%CC%85%3E%3E%3B%0A4000000%3A+I%CC%BFV%CC%BF%3E%3E%3B%0A5000000%3A+V%CC%BF%3E%3E%3B%0A6000000%3A+V%CC%BFI%CC%BF%3E%3E%3B%0A7000000%3A+V%CC%BFI%CC%BFI%CC%BF%3E%3E%3B%0A8000000%3A+V%CC%BFI%CC%BFI%CC%BFI%CC%BF%3E%3E%3B%0A9000000%3A+I%CC%BFX%CC%BF%3E%3E%3B%0A10000000%3A+X%CC%BF%3E%3E%3B%0A20000000%3A+X%CC%BFX%CC%BF%3E%3E%3B%0A30000000%3A+X%CC%BFX%CC%BFX%CC%BF%3E%3E%3B%0A40000000%3A+X%CC%BFL%CC%BF%3E%3E%3B%0A50000000%3A+L%CC%BF%3E%3E%3B%0A60000000%3A+L%CC%BFX%CC%BF%3E%3E%3B%0A70000000%3A+L%CC%BFX%CC%BFX%CC%BF%3E%3E%3B%0A80000000%3A+L%CC%BFX%CC%BFX%CC%BFX%CC%BF%3E%3E%3B%0A90000000%3A+X%CC%BFC%CC%BF%3E%3E%3B%0A100000000%3A+C%CC%BF%3E%3E%3B%0A200000000%3A+C%CC%BFC%CC%BF%3E%3E%3B%0A300000000%3A+C%CC%BFC%CC%BFC%CC%BF%3E%3E%3B%0A400000000%3A+C%CC%BFD%CC%BF%3E%3E%3B%0A500000000%3A+D%CC%BF%3E%3E%3B%0A600000000%3A+D%CC%BFC%CC%BF%3E%3E%3B%0A700000000%3A+D%CC%BFC%CC%BFC%CC%BF%3E%3E%3B%0A800000000%3A+D%CC%BFC%CC%BFC%CC%BFC%CC%BF%3E%3E%3B%0A900000000%3A+C%CC%BFM%CC%BF%3E%3E%3B%0A1000000000%3A+M%CC%BF%3E%3E%3B%0A2000000000%3A+M%CC%BFM%CC%BF%3E%3E%3B%0A3000000000%3A+M%CC%BFM%CC%BFM%CC%BF%3E%3E%3B%0A4000000000%3A+M%CC%BF%3BM%CC%BF%3BM%CC%BF%3BM%CC%BF%3E%3E%3B'
124 4 ASSIGN_OP 8 !0, '5000000000%3A+%3D%23%2C%23%230%3D%3B'
127 5 INIT_FCALL 'header'
6 SEND_VAL 'Content-Type%3A+text%2Fhtml%3B+charset%3Dutf-8'
7 DO_ICALL
130 8 NEW $10 'NumberFormatter'
9 SEND_VAL_EX 'en'
10 FETCH_CLASS_CONSTANT ~11 'NumberFormatter', 'PATTERN_RULEBASED'
11 SEND_VAL_EX ~11
12 SEND_VAR_EX !0
13 DO_FCALL 0
14 ASSIGN !1, $10
131 15 INIT_METHOD_CALL !1, 'format'
16 SEND_VAL_EX 2014
17 DO_FCALL 0 $14
18 ASSIGN !2, $14
132 19 INIT_METHOD_CALL !1, 'format'
20 SEND_VAL_EX 22
21 DO_FCALL 0 $16
22 ASSIGN !3, $16
133 23 ROPE_INIT 5 ~19 'Year+'
24 ROPE_ADD 1 ~19 ~19, !2
25 ROPE_ADD 2 ~19 ~19, '%2C+'
26 ROPE_ADD 3 ~19 ~19, !3
27 ROPE_END 4 ~18 ~19, '+Olympic+Winter+Games'
28 ECHO ~18
152 29 > RETURN 1
Generated using Vulcan Logic Dumper, using php 8.0.0
preferences:
170.43 ms | 1404 KiB | 16 Q