fix(salary-tools): decide number locale by last separator, pair compound headers

Review findings F7 and F8 (2026-08-19):

- parse_numeric_cell's both-separators branch always assumed European
  locale, silently turning a US "1,234.56" into 1.23456 - a 1000x
  corruption written to salary_data.json with no warning. The separator
  that appears last is now treated as the decimal separator, which also
  makes multi-group values ("1,234,567.89") parse instead of raising a
  raw float error. Single-separator ambiguity guards are unchanged.

- strip_type_patterns stripped only whole tokens, so the compound header
  "Lønindeks alle" kept its type word and could never pair with "Antal
  alle" - failing exactly for the compound-word locale COMPOUND_PATTERNS
  exists to support. It now also strips compound patterns as substrings,
  mirroring header_matches.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Mads Lorentzen
2026-08-19 19:48:50 +02:00
co-authored by Claude Opus 5
parent 7aba0b4a9d
commit 1c19f6c45f
3 changed files with 78 additions and 2 deletions
+10
View File
@@ -56,6 +56,16 @@ per-file diff commands.
### Fixed
- **`convert_salary_excel.py` no longer corrupts US/UK-formatted numbers 1000x** - the
both-separators branch always assumed European locale, so a `"1,234.56"` cell was
silently converted to `1.23456` and written into `salary_data.json`. The rule is now
"the separator that appears last is the decimal separator", which also makes
multi-group values (`"1,234,567.89"`, `"1.234.567,89"`) parse instead of raising. And
`strip_type_patterns` now strips `COMPOUND_PATTERNS` words as substrings, mirroring
`header_matches`, so a Danish compound header pair ("Antal alle" / "Lønindeks alle")
pairs into one category instead of two unpaired standalones - the exact locale the
compound support was added for. Pinned by six new cases in
`tests/test_convert_salary_excel.py`.
- **`jobdanmark-search` extracts the city when a comma follows the postcode** - the
`location` regex required whitespace after the 4-digit postcode, but live
`companyAddress` values frequently read `"2670, Greve"`; those results emitted