===== README.md ===== # Arbeitsprobe: Preisimport ohne stille Fehlinterpretation Neue, eigenständig erstellte Demonstration vom 11.09.2026. Kein Kundenprojekt, keine Referenzbehauptung, kein Befund über die Website eines Empfängers. Anbieter: Maximilian Niesen. ## Konkreter Fehler Ein Import erwartet deutsche Preisnotation, verwendet aber `parseFloat`. Die Eingabe `1.299,00` wird dadurch als `1.299` interpretiert. Auch `12abc` kann unbemerkt als Zahl durchgehen. Der Import darf bei falscher Notation keine scheinbar gültigen Preise übernehmen. ## Korrektur `price.mjs` prüft die gesamte Eingabe gegen das vereinbarte deutsche Format und berechnet zunächst mit ganzzahligen Centbeträgen. Ungültige Eingaben werden abgewiesen. Ein Ergebnis außerhalb des exakt darstellbaren Integer-Bereichs wird ebenfalls abgewiesen. Akzeptiert: `12`, `12,3`, `12,30`, `1299,00`, `1.299,00`, äußerer Leerraum einschließlich geschützter Leerzeichen. Abgewiesen: Währungszusätze, negative Zahlen, falsche Gruppierung, Dezimalpunkte, gemischte Länderformate, mehr als zwei Nachkommastellen und Teiltreffer. Andere Formate sind eine separate Produktentscheidung, keine automatische Vermutung. ## Prüfen Mit einer aktuellen Node.js-Version, ohne Installation zusätzlicher Pakete: ```sh node --test price.test.mjs ``` Die Tests reproduzieren zuerst die falsche bisherige Interpretation und prüfen gültige Preise, ungültige Formate und Grenzwerte. Tatsächliches Testergebnis: siehe `test-output.txt`. ## Einbau und Rücknahme An der bestehenden Importgrenze `parseGermanPriceToCents(rawPrice)` aufrufen. Erwartete Einheit des Folgesystems zuerst prüfen: Rückgabewert ist Cent, nicht Euro. Fehlerhafte Datensätze mit Zeilennummer zur Korrektur melden; nicht durch Null ersetzen. Erst auf einer Kopie bzw. in einer Testumgebung integrieren und vorhandene Importfälle prüfen. Vorherige Parser-Datei oder Git-Revision für eine Rücknahme aufbewahren. Diese Probe enthält keine Shopanbindung und ändert keine Kundendaten. Kein Nachweis einer abgeschlossenen Kundenintegration. Kontakt: support@carpulse24.de ===== price.mjs ===== /** Parse a non-negative price in explicit German notation into integer cents. * Accepted: 0, 12,3, 12,30, 1299,00, 1.299,00, and surrounding whitespace. * Rejected: currency labels, signs, partial matches, ambiguous decimal dots, * malformed grouping, more than two decimals, and unsafe numeric results. * No network, dependencies, telemetry, or floating-point monetary arithmetic. */ export function parseGermanPriceToCents(input) { if (typeof input !== 'string') throw new TypeError('Price must be a string'); const value = input.trim(); const match = /^(0|[1-9]\d*|[1-9]\d{0,2}(?:\.\d{3})+)(?:,(\d{1,2}))?$/u.exec(value); if (!match) throw new RangeError('Invalid German price'); const whole = BigInt(match[1].replaceAll('.', '')); const fraction = BigInt((match[2] ?? '').padEnd(2, '0')); const cents = whole * 100n + fraction; if (cents > BigInt(Number.MAX_SAFE_INTEGER)) throw new RangeError('Price exceeds safe integer range'); return Number(cents); } ===== price.test.mjs ===== import test from 'node:test'; import assert from 'node:assert/strict'; import { parseGermanPriceToCents } from './price.mjs'; test('reproduces the former partial parsing problem', () => { assert.equal(parseFloat('1.299,00'), 1.299); assert.notEqual(Math.round(parseFloat('1.299,00') * 100), 129900); assert.equal(parseGermanPriceToCents('1.299,00'), 129900); }); for (const [input, expected] of [ ['0', 0], ['0,00', 0], ['0,01', 1], ['12', 1200], ['12,3', 1230], ['12,30', 1230], ['1299,00', 129900], ['1.299,00', 129900], ['1.234.567,89', 123456789], [' \u00a012,30\u00a0 ', 1230], ['90071992547409,91', Number.MAX_SAFE_INTEGER], ]) { test(`accepts ${JSON.stringify(input)}`, () => assert.equal(parseGermanPriceToCents(input), expected)); } for (const input of [ '', ' ', '12abc', '12,30 EUR', '1,299.00', '12.50', '1.29,00', '1.2345,00', '01,00', '0.001,00', '12,345', '12,', ',50', '-1,00', '+1,00', '1e3', 'Infinity', 'NaN', '1 299,00', '90071992547409,92', ]) { test(`rejects ${JSON.stringify(input)}`, () => assert.throws(() => parseGermanPriceToCents(input), RangeError)); } test('rejects numbers and missing values instead of guessing their locale', () => { for (const input of [12.3, null, undefined, {}, []]) { assert.throws(() => parseGermanPriceToCents(input), TypeError); } }); ===== test-output.txt ===== Observed test run on 2026-09-11: Command: node --test RUN-0EUR-2026-09-11/SAMPLES/price-import/price.test.mjs Exit code: 0 tests: 33 pass: 33 fail: 0 cancelled: 0 skipped: 0 todo: 0 duration_ms: 167.0556 This is a concise transcription of the actual tool result, not a fabricated customer acceptance test or a claim of production integration.