fix: handle negative-zero and half-cent rounding in formatGermanAmount
This commit is contained in:
@@ -133,4 +133,26 @@ describe('buildCsv', () => {
|
|||||||
'Datum;Typ;Wer;Notiz;Betrag;Periodensaldo\r\nKeine Buchungen im gewählten Zeitraum',
|
'Datum;Typ;Wer;Notiz;Betrag;Periodensaldo\r\nKeine Buchungen im gewählten Zeitraum',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('formats negative-zero as positive zero', () => {
|
||||||
|
const csv = buildCsv([
|
||||||
|
{ date: '2026-08-05T00:00:00.000Z', type: 'expense', who: 'Teamkasse', note: 'Test', amount: -0.001, runningTotal: 0 },
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(csv).toBe(
|
||||||
|
'Datum;Typ;Wer;Notiz;Betrag;Periodensaldo\r\n' +
|
||||||
|
'2026-08-05;Ausgabe;Teamkasse;Test;0,00;0,00',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('rounds half-cent boundaries correctly', () => {
|
||||||
|
const csv = buildCsv([
|
||||||
|
{ date: '2026-08-05T00:00:00.000Z', type: 'payment', who: 'Alex Muster', note: 'Test', amount: 1.005, runningTotal: 1.005 },
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(csv).toBe(
|
||||||
|
'Datum;Typ;Wer;Notiz;Betrag;Periodensaldo\r\n' +
|
||||||
|
'2026-08-05;Zahlung;Alex Muster;Test;1,01;1,01',
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -68,7 +68,9 @@ const TYPE_LABELS: Record<string, string> = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function formatGermanAmount(value: number): string {
|
function formatGermanAmount(value: number): string {
|
||||||
return value.toFixed(2).replace('.', ',');
|
const rounded = Math.round((value + Number.EPSILON) * 100) / 100;
|
||||||
|
const normalized = rounded === 0 ? 0 : rounded;
|
||||||
|
return normalized.toFixed(2).replace('.', ',');
|
||||||
}
|
}
|
||||||
|
|
||||||
function escapeCsvField(value: string): string {
|
function escapeCsvField(value: string): string {
|
||||||
|
|||||||
Reference in New Issue
Block a user