Romeinse Cijfers

Door Chris Avontuur, 20 jaar geleden, 6.280x bekeken

Dit script heb ik een aantal jaar geleden geschreven in VBA. Ik hed nu de zelfde functionaliteit nodig in PHP en heb het script omgeschreven naar PHP. Het script genereert Romeinse Cijfers zoals deze tegenwoordig gebruikt worden. In de klasieke oudheid en middeleeuwen waren de regels veel soepeler. Ik ben niet verder gekomen dan 3999. De Romeinen gebruikten nooit het getal IV voor 4 maar IIII. IV waren namelijk de eerste 2 letter van de naam van de Opper God IVPITER (Jupiter). Verder werd in de oudheid de getallen (I) , ((I)) , (((I))) gebruikt voor respectievelijk 1.000, 10.000 en 100.000.

Gebruik:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo roman_numerals(2008);
?>

Voorbeeld: http://ghostwheel.hostsnake.com/index.php?option=1

Gesponsorde koppelingen

PHP script bestanden

  1. romeinse-cijfers

 

Er zijn 28 reacties op 'Romeinse cijfers'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jesper Diovo
Jesper Diovo
20 jaar geleden
 
0 +1 -0 -1
Leuk script! Voorbeeldje? :)
Aaa Trump
aaa Trump
20 jaar geleden
 
0 +1 -0 -1
Chill, kan erg handig zijn! :D
Frank -
Frank -
20 jaar geleden
 
0 +1 -0 -1
In PostgreSQL:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT TO_CHAR(2008, 'RN');

RN geeft aan dat romeinse cijfers moeten worden gebruikt.

Edit: Resultaat:
Quote:
MMVIII
Jesper Diovo
Jesper Diovo
20 jaar geleden
 
0 +1 -0 -1
@Frank: hou-nou-eens-eindelijk-op-met-je-eeuwig-durende-gezanik-over-postgresql.
Niet-iedereen-heeft-postgresql.
Niet-iedereen-gebruikt-postgresql.
Postgresql-is-soms-niet-nodig,-en-dan-is-dit-erg-handig.
Niels Janssen
Niels Janssen
20 jaar geleden
 
0 +1 -0 -1
Leuk script.

Nog wel een puntje, het zijn geen Roman Numbers maar Roman Numerals, er is een verschil omdat Romijnse cijfers geen nummers zijn.
Hipska BE
Hipska BE
20 jaar geleden
 
0 +1 -0 -1
en wat is de echo van het voorbeeldscriptje? (wat komt er uit?)
Chris Avontuur
Chris Avontuur
20 jaar geleden
 
0 +1 -0 -1
@Hipska, in het geval van het voorbeeld 2008 komt er MMVIII uit.

@Niels, bedankt voor de tip ik heb het aangepast!

@Djemo & pgFrank, Het is altijd leuk om te weten dat het ook anders kan als je de tools hebt. Maar als je die tools niet hebt moet je wat anders.
Arian Stolwijk
Arian Stolwijk
20 jaar geleden
 
0 +1 -0 -1
als je getal nu kleiner is dan nul, of groter is dan 3999, dan returnt hij een niet bestaande variabele, wat een E_NOTICE zal veroorzaken, of zie ik dat verkeerd.
Je zou bijvoorbeeld $roman_numerals = ''; iets omhoog kunnen verplaatsen... of een false returnen
Chris Avontuur
Chris Avontuur
20 jaar geleden
 
0 +1 -0 -1
@Arian, ik heb het script aangepast zodat je een foutmelding krijgt. Ik heb zelf het script hoofdzakelijk gebruikt voor jaartallen en dan hebben we voorlopg geen getallen nodig boven de 3999 ;)
Maar ik wil het script hiervoor aanpassen ik zal het boek dat ik toen gebruikt heb nog eens er bij pakken!
Aaa Trump
aaa Trump
20 jaar geleden
 
0 +1 -0 -1
@Djemo

Laat Frank lekker lullen, postgrsql owned nou aanmaal. :P
Vincent
Vincent
20 jaar geleden
 
0 +1 -0 -1
@Robin: maar jij niet in nederlands =)
Winston Smith
Winston Smith
20 jaar geleden
 
0 +1 -0 -1
Waarom de beperking tot 3.999 (niet alleen jaartallen hoeven in Romeinse cijfers weergegeven te worden)? En volgens mij moet het simpeler kunnen (zonder Postgres :P), maar daar moet ik nog even over nadenken :)

Wel een leuke en originele functie!
Storeman storeman
storeman storeman
20 jaar geleden
 
0 +1 -0 -1
Omdat de romeinen het niet nodig vonden om verder te tellen. het is wel getweakt, door wat streepjes boven de tekens te plaatsen.

Zie hier: http://en.wikipedia.org/wiki/Roman_numerals
Frank -
Frank -
20 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<ol start="2008" type="I">
    <li>test</li>
</ol>

type is inmiddels afgekeurd, het is dan ook netter om het met css te doen (list-style-type). Het werkt verder prima in de html.
Chris Avontuur
Chris Avontuur
20 jaar geleden
 
0 +1 -0 -1
@storeman

Ze konden echt wel verder tellen. Vooral als ze het aantal krijgsgevangen barbaren moesten weergeven. Dus het kan wel. Rekenen deden ze er volgens mij niet mee!

@kasper

Simpele reden dat ik het niet verder weet. Ik heb voor 4000 het teken voor 1000 nodig (M) en dat moet ik rechts van het teken voor 5000 plaatsen.
Soms wordt 4000 ook geschreven als IV.M (vier maal duizend)
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<ol style="list-style-type: upper-roman; margin-left: 100px;">
    <?php
        for($i = 1; $i < 3999; $i++)
        {

            echo '<li>Hiervoor staat '.$i.' in het latijn</li>';
        }

    ?>

</ol>
Marcel
Marcel
20 jaar geleden
 
0 +1 -0 -1
Dat gaat maar goed tot en met 3999 (hier, in FF)
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
@Marcel,

Hierboven kun je lezen dat Romeinen niet verder telden dan tot 3999
Jelle Posthuma
Jelle Posthuma
20 jaar geleden
 
0 +1 -0 -1
@PHP Newbie,

for($i = 1; $i < 3999; $i++)

Moet zijn:

for($i = 1; $i <= 3999; $i++)

Aangezien ze telden tot 3999 ipv. 3998 :P.
Chris Avontuur
Chris Avontuur
20 jaar geleden
 
0 +1 -0 -1
@Jelle Postma

De Romeinen konden wel verder tellen hoor dan 3999!

Op een gedenk steen op het forum stond een reeks van 23 keer het romeinse cijfer (((I))) om aan te geven dat in een oorlog 2.300.000 vijanden gevangen waren genomen.

Los van dat gebruikt het script de moderne interpretatie van het gebruik van Romeinse Cijfers (Dus niet IIII maar IV, niet IIX maar VIII, Niet IC maar XCIX)

En de meest logische toepassing van dit script is volgens mij in het geval van jaartallen of opsommingen (maar voor dat laatste is een betere oplossing!)
Storeman storeman
storeman storeman
20 jaar geleden
 
0 +1 -0 -1
Ik ben nog eens even aan het prutsen geweest, volgens mij moest het slimmer kunnen. Zie hier:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
class Storeman_Math_RomanNumerals{
    
    static $signs = array(1=>'I', 4=>'IV', 5=>'V', 9=>'IX', 10=>'X', 40=>'XL', 50=>'L', 90=>'XC', 100=>'C', 400=>'CD', 500=>'D', 900=>'CM', 1000=>'M' );
    
    static public function convertToRoman( $number ){
        if ($number > 0 and $number <= 3999) {
            $roman_numerals = '';
            
            krsort(self::$signs);
            
            foreach( self::$signs as $value=>$sign ){
                $repeat = floor($number/$value);
                
                $roman_numerals .= str_pad('', $repeat*strlen($sign), $sign);
                $number -= $value * $repeat;
            }
        }
else{
            $roman_numerals = 'Error: Input function roman_numarals() moet zijn >=0 en <= 3999!';
        }

        return $roman_numerals;
    }

    
    static public function convertFromRoman( $str){
        $integervalue = 0;
        
        
        $roman_numerals = '';
        
        krsort(self::$signs);
        
        $previousSign = '';
        $previousValue = 0;
        foreach( self::$signs as $value=>$sign ){
            $signlength = strlen($sign);
            
            while(substr($str, 0, $signlength) == $sign){
                $str = substr($str, $signlength);
                $integervalue += $value;
            }
        }

        
        return $integervalue;
    }
}


echo '4: ' . Storeman_Math_RomanNumerals::convertToRoman(4) . '<br>';
echo '5: ' . Storeman_Math_RomanNumerals::convertToRoman(5) . '<br>';
echo '9: ' . Storeman_Math_RomanNumerals::convertToRoman(9) . '<br>';
echo '10: ' . Storeman_Math_RomanNumerals::convertToRoman(10) . '<br>';
echo '13: ' . Storeman_Math_RomanNumerals::convertToRoman(13) . '<br>';
echo '130: ' . Storeman_Math_RomanNumerals::convertToRoman(130) . '<br>';
echo '145: ' . Storeman_Math_RomanNumerals::convertToRoman(145) . '<br>';
echo '------------------------<br>';
echo '------------------------<br>';
echo '4: ' . Storeman_Math_RomanNumerals::convertFromRoman("I") . '<br>';
echo '5: ' . Storeman_Math_RomanNumerals::convertFromRoman("V") . '<br>';
echo '5: ' . Storeman_Math_RomanNumerals::convertFromRoman("IX") . '<br>';
echo '5: ' . Storeman_Math_RomanNumerals::convertFromRoman("XII") . '<br>';
echo '5: ' . Storeman_Math_RomanNumerals::convertFromRoman("CLXII") . '<br>';

?>


Het kan waarschijnlijk nog wel efficienter, door automatisch te bepalen van de 4, 40, etc, maar zo vond ik het wel even best :)
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
Ik heb er even geen tijd voor maar het kan zeker weten nog veel makkelijker!

getal > 4000 dan kan je in html:
<span style="text-decoration:overline;">V</span> e.d. gebruiken.

En anders is het gewoon formatten?!
str_repeat(, round(getal/0.001));
lijkt me?

dus MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXCI e.d.


@TS:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$roman_numerals
= '';
if($rest % 1000 > 0) { //modulo, het verschil tussen $rest en 1000 > 1
   //bijvoorbeeld 2.010293, die rond je af en je bent weer een while() armer!
    //met .= lijm je het eraan dus niet nog een keer die veelste lange var nodig

    $roman_numerals .= str_repeat("M", (int) $rest % 1000) //etc..
    //(int) geeft heel getal, intval(); round(); floor(); ook
    //met eventuele afronding... voor de volgende iteratie...

}
?>


Als ik tijd heb zal ik 'm eens even aanpakken...
Lissy Pixel
Lissy Pixel
20 jaar geleden
 
0 +1 -0 -1
Dank jullie wel voor alle input en voorbeelden!!!
Weer wat geleerd :)
Chris Avontuur
Chris Avontuur
20 jaar geleden
 
0 +1 -0 -1
@Storeman:
Thanx goede aanpassing!

@Lode:
Opzich goed opgelost maar output is niet echt leesbaar. Daarom wordt boven 4.000 of 5.000 afgestapt van het optel/aftrek pricipe en wordt er vermenigvuldigd.
5.000 = V.M of V.(I) lees als 5 maal 1.000
50.000 = V.((I)) lees als 5 maal 10.000
500.000 = V.(((I))) lees als 5 maal 100.000
1.000.000 = X.(((I)))

Soms werden er ook vreemdere notaties gebruikt bijvoor beeld:
88 = IV.XX VIII lees als 4 maal 20 plus 8
Mark L
Mark L
20 jaar geleden
 
0 +1 -0 -1
98 = XCVIII? niet gewoon IIL?

Wel leuk gedaan. Ik ben er ook eens een tijd mee bezig geweest. Het is wel redelijk gelukt, tot bepaalde hoogte.
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
jammer dat ik het zo druk heb.. ik ben er bijna uit.. en scheelt nogal wat..
Steen
steen
20 jaar geleden
 
0 +1 -0 -1
Mooi script! Handig ook!
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Chris Avontuur
Chris Avontuur
20 jaar geleden
 
0 +1 -0 -1
@ Miloan

Nee IIL zou 48 kunnen zijn maar volgens de regels mag je alleen I, X of C aftrekken. Bovendien Mag je I alleen aftrekken van V of X, X alleen van L of C en C alleen van M.

XCVIII moet je dus lezen als (100 - 10) + ( V+1+1+1) = 90 + 8 = 98

Maar zoals ik al eerder schreef is dat volgens onze moderne regels. De Romeinen (en ook de middeleeuwers) gingen er veel soepeler mee om!

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. romeinse-cijfers

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.