JavaScriptsMathematik

Römisch Dezimal

Wandelt Dezimalzahlen in römische Zahlen um — und römische Zahlen zurück ins Dezimalsystem.

Dieses Script übersetzt zwischen zwei Zahlensystemen: Es wandelt unsere gewohnten Dezimalzahlen in römische Zahlen um — und liest umgekehrt eine römische Zahl und rechnet sie zurück ins Dezimalsystem. Eingeschickt hat es unser User Vollautomatisch.

Die Bedienung ist einfach: Tragt in das obere Feld eine Dezimalzahl ein und klickt auf „In römische Zahl", schon erscheint das Ergebnis im unteren Feld. Für die Gegenrichtung schreibt ihr eine römische Zahl (aus den Zeichen I, V, X, L, C, D, M — Groß- oder Kleinschreibung ist egal) in das untere Feld und klickt auf „In Dezimalzahl".

Zum Hintergrund: Die Römer kannten sieben Zahlzeichen — I = 1, V = 5, X = 10, L = 50, C = 100, D = 500 und M = 1000. Zahlen entstehen durch Aneinanderreihen und Addieren (VIII = 8). Die Besonderheit ist die Subtraktionsregel: Steht ein kleineres Zeichen vor einem größeren, wird es abgezogen — IV ist 4 (5 − 1), MCM ist 1900 (1000 + 1000 − 100). Eine Null kannten die Römer nicht, und für sehr große Zahlen werden schlicht viele M aneinandergehängt.

Wer speziell Jahreszahlen umrechnen möchte, findet bei uns auch das Script Römische Jahreszahl berechnen. Weitere Zahlensystem-Umrechner im Archiv: Dezimalzahl in Binärzahl umwandeln und Hexadezimal zu Dezimal.

Mathematik Baujahr 2007 läuft in deinem Browser
Eingesandt von Vollautomatisch

So funktioniert das Script

Das Script besteht aus zwei Übersetzungsfunktionen — dec2rom() für die Richtung Dezimal → Römisch und rom2dec() für den Rückweg — plus ein wenig Verkabelung, die die beiden Knöpfe mit den Eingabefeldern verbindet. Alles steckt in einer sofort ausgeführten Funktion, damit die Variablennamen nicht mit anderen Scripts auf der Seite kollidieren.

const adds = ["I", "X", "C", "M"];    // dürfen nebeneinander stehen (8 = "VIII")
const noAdds = ["V", "L", "D"];       // dürfen nicht verdoppelt werden

Der Kern von dec2rom() sind diese beiden Arrays. Sie enthalten die römischen Zeichen sortiert nach Stellenwert: adds[0] ist das Zeichen für die Einer (I), adds[1] das für die Zehner (X) und so weiter. Die Zeichen in noAdds (V, L, D) stehen für 5, 50 und 500 — sie dürfen in einer römischen Zahl nie doppelt vorkommen, „VV" für 10 gibt es nicht.

for (let i = 0; i < len; i++) {
  const d = Number(dec.charAt(i));    // aktuelle Ziffer
  const pos = len - 1 - i;            // Stellenwert: 0 = Einer, 1 = Zehner, ...

Die Funktion arbeitet die Dezimalzahl Ziffer für Ziffer als Text ab. charAt(i) holt die Ziffer an Position i, und pos rechnet aus, um welchen Stellenwert es sich handelt — bei „427" ist die 4 an Position 0, aber vom Stellenwert her die Hunderterstelle (pos = 2). Mit pos wird dann in den Arrays das passende Zeichen nachgeschlagen.

else if (d === 4) { rN += adds[pos] + noAdds[pos]; }   // 4 → "IV"
else if (d === 9) { rN += adds[pos] + adds[pos + 1]; } // 9 → "IX"

Hier steckt die Subtraktionsregel: Eine 4 wird als kleineres Zeichen vor dem Fünfer-Zeichen geschrieben (auf der Einerstelle „IV", auf der Zehnerstelle „XL"), eine 9 als kleineres Zeichen vor dem Zeichen der nächsthöheren Stelle (adds[pos + 1], also „IX" oder „XC"). Die Ziffern 1–3 und 6–8 werden dagegen in kleinen Schleifen durch simples Aneinanderhängen gebildet, wie in „III" oder „VIII".

while (num > 1000) { num -= 1000; thousand++; }
...
for (let m = 0; m < thousand; m++) { rN = "M" + rN; }

Weil die Römer für Zahlen über 1000 einfach weitere M voranstellten, zieht das Script vor der eigentlichen Umwandlung so oft 1000 ab, bis maximal 1000 übrig bleibt, und merkt sich die Anzahl in thousand. Am Ende wird für jede abgezogene Tausend ein „M" vor das Ergebnis gesetzt — aus 4156 wird so „MMM" plus die Übersetzung von 1156.

if (posl >= poslA) { dec += values[posl]; }
else { dec = dec - values[posl] + values[poslA]; i++; }

Die Rückrichtung rom2dec() geht die römische Zahl Zeichen für Zeichen durch und schaut dabei immer auch auf das nächste Zeichen: Ist das aktuelle Zeichen (posl) mindestens so groß wie das folgende (poslA), wird sein Wert einfach addiert. Ist das folgende Zeichen größer, greift die Subtraktionsregel — der kleinere Wert wird abgezogen, der größere addiert, und i++ überspringt das bereits verarbeitete Folgezeichen. So wird aus „MCM" korrekt 1000 + (1000 − 100) = 1900.

document.getElementById("rd-nach-rom").addEventListener("click", function () {
  ...
  romFeld.value = dec2rom(decFeld.value);
});

Zum Schluss werden die Knöpfe per addEventListener mit den Funktionen verbunden. Vor der Umwandlung prüft das Script die Eingabe: Die Dezimalzahl muss eine ganze Zahl ab 1 sein, die römische Zahl darf nur die sieben gültigen Zeichen enthalten — der reguläre Ausdruck /[^IVXLCDM]/ schlägt an, sobald ein anderes Zeichen auftaucht, und in der Ergebnisfläche erscheint ein Hinweis statt eines falschen Werts.

Zum Anpassen: Die Meldungstexte könnt ihr frei ändern. Wenn ihr die römische Zahl lieber klein geschrieben ausgeben wollt, ersetzt ihr toUpperCase() am Ende von dec2rom() durch toLowerCase().

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