Files
SimpleFinanceDash/.planning/phases/04-chart-polish-and-bug-fixes/04-01-PLAN.md

3.8 KiB

phase, plan, type, wave, depends_on, files_modified, autonomous, requirements, must_haves
phase plan type wave depends_on files_modified autonomous requirements must_haves
04-chart-polish-and-bug-fixes 01 tdd 1
frontend/src/lib/format.ts
frontend/src/lib/format.test.ts
true
FIX-01
truths artifacts key_links
formatCurrency no longer hardcodes 'de-DE' — the default locale is 'en'
formatCurrency accepts an optional third locale parameter
Calling formatCurrency(1234.56, 'EUR', 'de') produces German-formatted output
Calling formatCurrency(1234.56, 'USD', 'en') produces English-formatted output
Calling formatCurrency(1234.56, 'EUR') without locale uses 'en' default, not 'de-DE'
path provides contains
frontend/src/lib/format.ts Locale-aware formatCurrency function locale
path provides min_lines
frontend/src/lib/format.test.ts Unit tests for formatCurrency locale behavior 20
from to via pattern
frontend/src/lib/format.ts Intl.NumberFormat locale parameter passed as first arg Intl.NumberFormat(locale
Fix the hardcoded `'de-DE'` locale in `formatCurrency` by adding an optional `locale` parameter with `'en'` as the default. This is the foundation for IXTN-04 (chart tooltips) and ensures all currency formatting respects the user's locale preference.

Purpose: FIX-01 — English-locale users currently see German number formatting everywhere Output: Updated format.ts with locale parameter, comprehensive unit tests

<execution_context> @/home/jean-luc-makiola/.claude/get-shit-done/workflows/execute-plan.md @/home/jean-luc-makiola/.claude/get-shit-done/templates/summary.md </execution_context>

@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/phases/04-chart-polish-and-bug-fixes/04-RESEARCH.md @frontend/src/lib/format.ts Locale-aware formatCurrency frontend/src/lib/format.ts, frontend/src/lib/format.test.ts - formatCurrency(1234.56, 'EUR', 'en') returns a string containing "1,234.56" (English grouping) - formatCurrency(1234.56, 'EUR', 'de') returns a string containing "1.234,56" (German grouping) - formatCurrency(1234.56, 'USD', 'en') returns a string containing "$" and "1,234.56" - formatCurrency(1234.56, 'EUR') with NO locale arg uses 'en' default — does NOT produce German formatting - formatCurrency(0, 'EUR', 'en') returns a string containing "0.00" - formatCurrency(-500, 'EUR', 'en') returns a string containing "-" and "500.00" - formatCurrency(1234.56, 'EUR', '') falls back gracefully (does not throw RangeError) Update `frontend/src/lib/format.ts`:
```ts
export function formatCurrency(
  amount: number,
  currency: string = 'EUR',
  locale: string = 'en'
): string {
  return new Intl.NumberFormat(locale || 'en', {
    style: 'currency',
    currency,
  }).format(amount)
}
```

Key points:
- Third parameter `locale` defaults to `'en'` (replacing hardcoded `'de-DE'`)
- Defensive `locale || 'en'` guards against empty string (which throws RangeError)
- All existing call sites pass only 2 args — they will now get English formatting instead of German
- This is intentional and correct per FIX-01
cd frontend && bun vitest run src/lib/format.test.ts

<success_criteria>

  • format.test.ts has at least 6 test cases covering locale variations, defaults, and edge cases
  • All tests pass green
  • formatCurrency signature has 3 parameters: amount, currency, locale
  • No hardcoded 'de-DE' remains in format.ts </success_criteria>
After completion, create `.planning/phases/04-chart-polish-and-bug-fixes/04-01-SUMMARY.md`