Aufwärmen · Aufgabe 1 von 7
Zum Aufwärmen aus Lektion I5.3. Ein Datumstext von Hand gebaut. Was gibt das aus?
const d = new Date(Date.UTC(2026, 9, 5));
console.log(d.getUTCMonth() + 1 + "/" + d.getUTCDate());// I5.4 · ca. 34 Min. · Aufbau
Nach dieser Lektion zeigen Sie Zahlen, Euro-Preise, Daten, relative Zeiten und Listen so an, wie Menschen in Deutschland oder den USA es erwarten, mit derselben Ausgabe auf jedem Computer.
Danach können Sie
Aufwärmen · Aufgabe 1 von 7
const d = new Date(Date.UTC(2026, 9, 5));
console.log(d.getUTCMonth() + 1 + "/" + d.getUTCDate());Vorhersagen · Aufgabe 2 von 7
const n = 1234.5;
console.log(n.toLocaleString("de-DE"), n.toLocaleString("en-US"));Üben · Aufgabe 3 von 7
const eur = new Intl.NumberFormat("de-DE", { style: "currency", ____: "EUR" });
console.log(eur.format(5));Üben · Aufgabe 4 von 7
Üben · Aufgabe 5 von 7
console.log(new Intl.NumberFormat("en-US", { style: "percent" }).format(0.256));Denksport · Aufgabe 6 von 7
const price = new Intl.NumberFormat("de-DE", { style: "currency", currency: "EUR" }).format(5);
console.log(price === "5,00 €", price.length);Anwenden · Aufgabe 7 von 7
Prüfen Sie Ihr Ergebnis anhand dieser Liste
Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.
Ausgearbeitetes Beispiel
Derselbe Preis wird für Deutschland und für die USA formatiert, dann ein Prozentwert und eine kompakte Zahl. Ein Datum mit Uhrzeit wird mit timeZone: "UTC" auf Deutsch geschrieben, und derselbe Moment wird als Berliner Zeit gezeigt. Relative Zeit, Pluralregeln und eine Liste folgen. Die letzte Zeile schaut in einen formatierten Preis hinein: Er hat sechs Zeichen, und das fünfte ist kein gewöhnliches Leerzeichen.
main.js
const when = new Date(Date.UTC(2026, 9, 5, 14, 30));
// 1. Numbers and prices: the same number for two locales.
const eurDE = new Intl.NumberFormat("de-DE", { style: "currency", currency: "EUR" });
const eurUS = new Intl.NumberFormat("en-US", { style: "currency", currency: "EUR" });
console.log(eurDE.format(1234.56), "|", eurUS.format(1234.56));
console.log(new Intl.NumberFormat("en-US", { style: "percent" }).format(0.256));
console.log(new Intl.NumberFormat("en-US", { notation: "compact" }).format(1234567));
// 2. Dates: always give a timeZone, or the output depends on the computer.
const long = new Intl.DateTimeFormat("de-DE", { dateStyle: "long", timeStyle: "short", timeZone: "UTC" });
console.log(long.format(when));
const berlin = new Intl.DateTimeFormat("en-GB", { timeStyle: "short", timeZone: "Europe/Berlin" });
console.log("in Berlin:", berlin.format(when));
// 3. Relative time, plural rules and lists.
const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
console.log(rtf.format(-1, "day"), "|", rtf.format(3, "day"));
const plural = new Intl.PluralRules("en");
for (const n of [1, 2]) console.log(n, plural.select(n) === "one" ? "file" : "files");
console.log(new Intl.ListFormat("en", { type: "conjunction" }).format(["Map", "Set", "Intl"]));
// 4. The space before € is not an ordinary space.
const price = eurDE.format(5);
console.log(price.length, "U+" + price.codePointAt(4).toString(16).padStart(4, "0"));
Ausführen mit
node main.jsAusgabe
1.234,56 € | €1,234.56
26%
1.2M
5. Oktober 2026 um 14:30
in Berlin: 16:30
yesterday | in 3 days
1 file
2 files
Map, Set, and Intl
6 U+00a0Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.
Übung 1 von 2
formatPrice(cents, locale) bekommt einen Betrag in Cent und ein Locale und gibt den Preis in Euro so zurück, wie dieses Locale ihn schreibt: formatPrice(1250, "de-DE") ist "12,50 €" mit einem geschützten Leerzeichen, und formatPrice(1250, "en-US") ist "€12.50". Der Startcode baut den Text von Hand und ignoriert das Locale. Nutzen Sie Intl.NumberFormat.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.
Führen Sie die Tests aus: Das deutsche Ergebnis hat einen Punkt und ein gewöhnliches Leerzeichen. Welches Werkzeug kennt die Regeln jedes Locales?
new Intl.NumberFormat(locale, { style: "currency", currency: "EUR" })
Teilen Sie vor dem Formatieren durch 100: eur.format(cents / 100).
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
export function formatPrice(cents, locale) {
const eur = new Intl.NumberFormat(locale, { style: "currency", currency: "EUR" });
return eur.format(cents / 100);
}
Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.js
export function formatPrice(cents, locale) {
return (cents / 100).toFixed(2) + " €";
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {formatPrice} from './main.js';
test('Deutsch: 12,50 und ein geschütztes Leerzeichen vor dem Eurozeichen', () => {
const got = formatPrice(1250, 'de-DE');
assert.equal(got, '12,50\u00a0€', `formatPrice(1250, 'de-DE') gab ${JSON.stringify(got)}`);
});
test('Amerikanisches Englisch: Das Eurozeichen kommt zuerst', () => {
const got = formatPrice(1250, 'en-US');
assert.equal(got, '€12.50', `formatPrice(1250, 'en-US') gab ${JSON.stringify(got)}`);
});
test('Tausender werden gruppiert', () => {
const got = formatPrice(123456, 'de-DE');
assert.equal(got, '1.234,56\u00a0€', `formatPrice(123456, 'de-DE') gab ${JSON.stringify(got)}`);
});
package.json
{
"type": "module"
}
package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.
Programm ausführen:
node main.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenÜbung 2 von 2
daysAgo(timestamp, now) bekommt zwei Timestamps zu UTC-Mitternacht und gibt englischen Text zurück: "yesterday" für einen Tag zurück, "today" für denselben Tag, "tomorrow" für einen Tag voraus und sonst "3 days ago" oder "in 2 days". Der Startcode schreibt immer "N days ago", auch für einen Tag oder für die Zukunft. Nutzen Sie Intl.RelativeTimeFormat mit numeric: "auto".
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.
RelativeTimeFormat will für die Vergangenheit eine negative Zahl: format(-1, "day").
Berechnen Sie also (timestamp - now) / DAY, nicht (now - timestamp) / DAY.
const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" }); return rtf.format(days, "day");
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
const DAY = 24 * 60 * 60 * 1000;
const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
export function daysAgo(timestamp, now) {
const days = Math.round((timestamp - now) / DAY);
return rtf.format(days, "day");
}
Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.js
const DAY = 24 * 60 * 60 * 1000;
export function daysAgo(timestamp, now) {
const days = Math.round((now - timestamp) / DAY);
return `${days} days ago`;
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {daysAgo} from './main.js';
const now = Date.UTC(2026, 9, 5);
const day = (n) => Date.UTC(2026, 9, 5 + n);
test('Ein Tag zurück ist yesterday', () => {
assert.equal(daysAgo(day(-1), now), 'yesterday', `bekam ${daysAgo(day(-1), now)}`);
});
test('Drei Tage zurück ist 3 days ago', () => {
assert.equal(daysAgo(day(-3), now), '3 days ago', `bekam ${daysAgo(day(-3), now)}`);
});
test('Derselbe Tag ist today', () => {
assert.equal(daysAgo(now, now), 'today', `bekam ${daysAgo(now, now)}`);
});
test('Zwei Tage voraus ist in 2 days', () => {
assert.equal(daysAgo(day(2), now), 'in 2 days', `bekam ${daysAgo(day(2), now)}`);
});
package.json
{
"type": "module"
}
package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.
Programm ausführen:
node main.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenconst price = new Intl.NumberFormat("de-DE", { style: "currency", currency: "EUR" }).format(12.5);
const [amount, symbol] = price.split(" ");
console.log(symbol.toUpperCase());
Was Node.js ausgibt
TypeError: Cannot read properties of undefined (reading 'toUpperCase')Warum, und die Lösung
Das Leerzeichen in "12,50 €" ist ein geschütztes Leerzeichen, U+00A0, nicht " ", split(" ") findet also nichts zum Trennen, und symbol ist undefined. Zerlegen Sie formatierten Text nicht; er ist für Menschen. Brauchen Sie die Teile, nutzen Sie formatToParts(12.5), das sie als Objekte liefert, oder halten Sie die Zahl und den Währungscode getrennt.
const price = new Intl.NumberFormat("de-DE", { style: "currency" });
console.log(price.format(5));
Was Node.js ausgibt
TypeError: Currency code is required with currency style.Warum, und die Lösung
Intl kann die Währung nicht aus dem Locale erraten: Deutschland und Österreich nutzen Euro, aber ein deutscher Shop kann in Dollar verkaufen. Geben Sie immer den Code an: { style: "currency", currency: "EUR" }.
const time = new Intl.DateTimeFormat("de-DE", { timeStyle: "short", timeZone: "Berlin" });
console.log(time.format(new Date()));
Was Node.js ausgibt
RangeError: Invalid time zone specified: BerlinWarum, und die Lösung
timeZone nimmt einen IANA-Zeitzonennamen, also Region und Stadt: "Europe/Berlin", "America/New_York". "UTC" und Offsets wie "+01:00" funktionieren ebenfalls. Eine Stadt allein ist kein gültiger Name.
JavaScript im Browser: die eigene Engine Ihres Browsers in einem abgeschotteten Worker. Syntaxfehler findet acorn 8.18.0, MIT. Lizenz und Quellcode
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.