diff --git a/src/lib/quantity-format.ts b/src/lib/quantity-format.ts new file mode 100644 index 0000000..8215eb7 --- /dev/null +++ b/src/lib/quantity-format.ts @@ -0,0 +1,7 @@ +export function formatQuantity(q: number | null): string { + if (q === null || q === undefined) return ''; + const rounded = Math.round(q); + if (Math.abs(q - rounded) < 0.01) return String(rounded); + // auf max. 2 Nachkommastellen, trailing Nullen raus + return q.toFixed(2).replace(/\.?0+$/, ''); +} diff --git a/tests/unit/quantity-format.test.ts b/tests/unit/quantity-format.test.ts new file mode 100644 index 0000000..f2ce542 --- /dev/null +++ b/tests/unit/quantity-format.test.ts @@ -0,0 +1,28 @@ +import { describe, it, expect } from 'vitest'; +import { formatQuantity } from '../../src/lib/quantity-format'; + +describe('formatQuantity', () => { + it('renders null as empty string', () => { + expect(formatQuantity(null)).toBe(''); + }); + + it('renders whole numbers as integer', () => { + expect(formatQuantity(400)).toBe('400'); + }); + + it('renders near-integer as integer (epsilon 0.01)', () => { + expect(formatQuantity(400.001)).toBe('400'); + expect(formatQuantity(399.999)).toBe('400'); + }); + + it('renders fractional with up to 2 decimals, trailing zeros trimmed', () => { + expect(formatQuantity(0.5)).toBe('0.5'); + expect(formatQuantity(0.333333)).toBe('0.33'); + expect(formatQuantity(1.1)).toBe('1.1'); + expect(formatQuantity(1.1)).toBe('1.1'); + }); + + it('handles zero', () => { + expect(formatQuantity(0)).toBe('0'); + }); +});