JavaScriptsMathematik

Römische Jahreszahl berechnen

Wandelt eine Jahreszahl von 1 bis 5999 in römische Ziffern um — aus 1984 wird MCMLXXXIV.

Mit diesem Script könnt ihr Jahreszahlen aus der heute üblichen Schreibweise in römische Ziffern umrechnen. Tragt eine Zahl zwischen 1 und 5999 in das Feld ein und klickt auf „Umrechnen“ — oder drückt einfach die Eingabetaste. Voreingestellt ist 1984, daraus wird MCMLXXXIV.

Römische Ziffern begegnen einem öfter, als man denkt: auf Zifferblättern alter Uhren, an Hausfassaden und Denkmälern, im Abspann von Filmen, in der Gliederung von Büchern und bei Namen von Königen und Päpsten. Nur weiß kaum jemand auf Anhieb, welche Zahl sich hinter einer längeren Ziffernfolge verbirgt.

Das System kennt sieben Zeichen: I = 1, V = 5, X = 10, L = 50, C = 100, D = 500 und M = 1000. Sie werden von links nach rechts aufaddiert, wobei nie mehr als drei gleiche Zeichen hintereinander stehen. Für die Vierer und Neuner gibt es die Subtraktionsregel: Steht ein kleineres Zeichen vor einem größeren, wird es abgezogen — IV ist 4, IX ist 9, XL ist 40, CM ist 900. Eine Null gibt es in diesem System nicht, und die 5999 ist hier die Obergrenze, weil darüber hinaus immer mehr M nebeneinander stehen müssten.

Den Weg zurück — von römischen Ziffern zur normalen Zahl — geht das Script Römisch/Dezimal. Weitere Umwandlungen zwischen Zahlensystemen findet ihr bei Dezimalzahl in Binärzahl umwandeln und Hexadezimal zu Dezimal.

Mathematik Baujahr 2004 läuft in deinem Browser

Möglich sind ganze Zahlen von 1 bis 5999.

Script von Dougie Lawson

So funktioniert das Script

Das Script besteht aus zwei Teilen: vier fertigen Listen mit den römischen Bausteinen und einer Funktion, die die eingegebene Zahl in Tausender, Hunderter, Zehner und Einer zerlegt und für jede Stelle den passenden Baustein heraussucht. Zusammengesetzt ergibt das die römische Zahl.

const einer  = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
const zehner = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"];

Das ist der Kern der Idee: Statt die Subtraktionsregel zu programmieren, werden alle zehn Möglichkeiten je Stelle einfach hingeschrieben. Ein Array ist eine nummerierte Liste; gezählt wird ab null. einer[4] ist also "IV", zehner[9] ist "XC". An Position 0 steht bewusst eine leere Zeichenkette — eine Null hat im römischen System kein Zeichen und trägt zum Ergebnis nichts bei.

let zahl = parseInt(feld.value.trim(), 10);
if (isNaN(zahl)) {
  ausgabe.textContent = "Bitte eine ganze Zahl zwischen 1 und 5999 eintragen.";
  return;
}

parseInt liest aus dem Text des Feldes eine ganze Zahl; die 10 dahinter sagt, dass im Zehnersystem gelesen werden soll. Steht dort etwas anderes als eine Zahl, liefert parseInt den Wert NaN („not a number“). Genau das prüft isNaN, und return beendet die Funktion, bevor Unsinn gerechnet wird.

if (zahl < 1) { zahl = 1; hinweis = " (kleiner als 1 ...)"; }
if (zahl > 5999) { zahl = 5999; hinweis = " (mehr als 5999 ...)"; }

Zahlen außerhalb des Bereichs werden auf die nächstgelegene Grenze gezogen und der Grund dafür in hinweis gemerkt, der später ans Ergebnis angehängt wird. Das alte Script zeigte an dieser Stelle ein alert()-Fenster an, das man wegklicken musste; die Meldung direkt neben dem Ergebnis ist angenehmer.

const roemisch =
  tausender[Math.floor(zahl / 1000)] +
  hunderter[Math.floor((zahl % 1000) / 100)] +
  zehner[Math.floor((zahl % 100) / 10)] +
  einer[zahl % 10];

Hier passiert die eigentliche Arbeit, und sie besteht nur aus Teilen und Restrechnen. Der Prozentoperator % liefert den Rest einer Division: 1984 % 1000 ist 984. Math.floor rundet ab. Für 1984 heißt das der Reihe nach: 1984/1000 abgerundet ist 1, also tausender[1] = „M“. Der Rest 984, geteilt durch 100 und abgerundet, ist 9, also hunderter[9] = „CM“. Der Rest 84, geteilt durch 10, ist 8, also zehner[8] = „LXXX“. Und 1984 % 10 ist 4, also einer[4] = „IV“. Aneinandergehängt: MCMLXXXIV.

feld.addEventListener("keydown", function (ereignis) {
  if (ereignis.key === "Enter") umrechnen();
});

Eine kleine Bequemlichkeit: Das Script horcht auf Tastendrücke im Eingabefeld und ruft bei der Eingabetaste dieselbe Funktion auf wie der Knopf. ereignis.key enthält den Namen der gedrückten Taste.

Zum Anpassen: Die Obergrenze steckt in der Liste tausender. Wollt ihr bis 9999 rechnen, hängt einfach "MMMMMM", "MMMMMMM" und so weiter an und ändert die beiden 5999 im Code. Und wer keine Jahreszahl, sondern etwa Kapitelnummern umwandeln will, muss überhaupt nichts ändern — die Rechnung kennt keinen Unterschied.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Mathematik