{"abstract":"'1 234,500' euros is refused although the extra digit is a zero.","category":"Currency rounding and FX conversion","checks":8,"contract":"solve(text, locale, exp): parse a localized amount into integer minor units at exponent exp. Group/decimal separators: en ',' '.', de '.' ',', ch \"'\" '.', fr ' ' or U+202F and ','. An optional leading '-' marks a negative amount (including -0.xx). If grouping is used, the first group has 1-3 digits and every later group exactly 3. A decimal separator must be followed by digits. Fraction digits beyond exp are allowed only if they are zeros, otherwise 'ERR:precision'. Malformed text returns 'ERR:format'; an unknown locale 'ERR:locale'.","evaluation_group":"w2-currency_rounding_and_fx_conversion-locale-amount-parsing","failed_approach":"Silently truncating extra digits accepts amounts with non-zero sub-minor precision.","family":"w2-currency_rounding_and_fx_conversion-locale-amount-parsing-excess-fraction-zeros","id":"FA-62126","implementations":{"attempt":{"sha256":"514af0ce63d699fc4980e3de599282df33ee93d2065ecd2dcbaa1cd9035922ac","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(text, locale, exp):\n    seps = {'en': (',', '.'), 'de': ('.', ','), 'ch': (\"'\", '.'), 'fr': (' \\u202f', ',')}\n    if locale not in seps: return 'ERR:locale'\n    groups, dec = seps[locale]\n    dig = lambda t: t != '' and all(c in '0123456789' for c in t)\n    s = text.strip()\n    neg = s.startswith('-')\n    if neg: s = s[1:]\n    whole, _, frac = s.partition(dec)\n    for g in groups[1:]: whole = whole.replace(g, groups[0])\n    parts = whole.split(groups[0])\n    if not all(dig(p) for p in parts) or (dec in s and not dig(frac)): return 'ERR:format'\n    if len(parts) > 1 and (len(parts[0]) > 3 or any(len(p) != 3 for p in parts[1:])): return 'ERR:format'\n    pass\n    frac = frac[:exp].ljust(exp, '0')\n    v = int(''.join(parts)) * 10 ** exp + (int(frac) if frac else 0)\n    return -v if neg else v\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression excess-fraction-zeros 1', ('1\\u202f234,500', 'fr', 2), 123450),\n  ('regression excess-fraction-zeros 2', ('100000,0010', 'fr', 3), 100000001),\n  ('partial repair guard 1', ('12.345', 'en', 2), 'ERR:precision'),\n  ('partial repair guard 2', ('999,50', 'fr', 0), 'ERR:precision'),\n  ('control: english grouping', ('1,234.56', 'en', 2), 123456),\n  ('control: german short fraction', ('1.234,5', 'de', 2), 123450),\n  ('control: negative below one', ('-0,50', 'de', 2), -50),\n  ('control: bad grouping', ('1,23,4.00', 'en', 2), 'ERR:format')],\n [('regression excess-fraction-zeros 1', ('-0,500', 'fr', 2), -50),\n  ('regression excess-fraction-zeros 2', ('12.345,500', 'de', 2), 1234550),\n  ('partial repair guard 1', ('999.500', 'en', 0), 'ERR:precision'),\n  ('partial repair guard 2', ('-1.000,0010', 'de', 0), 'ERR:precision'),\n  ('control: narrow space with trailing zero', ('1\\u202f234,500', 'fr', 2), 123450),\n  ('control: excess precision', ('12.345', 'en', 2), 'ERR:precision'),\n  ('control: bad grouping', ('1,23,4.00', 'en', 2), 'ERR:format'),\n  ('control: dinar fraction', ('12.5', 'en', 3), 12500)],\n [('regression excess-fraction-zeros 1', ('12345.0010', 'en', 3), 12345001),\n  ('regression excess-fraction-zeros 2', ('1\\u202f000,0010', 'fr', 3), 1000001),\n  ('partial repair guard 1', ('999,0010', 'fr', 2), 'ERR:precision'),\n  ('partial repair guard 2', ('100000.5', 'ch', 0), 'ERR:precision'),\n  ('control: dinar fraction', ('12.5', 'en', 3), 12500), ('control: swiss integer', (\"1'000\", 'ch', 0), 1000),\n  ('control: french plain space', ('12 345,6', 'fr', 2), 1234560),\n  ('control: dangling separator', ('12.', 'en', 2), 'ERR:format')],\n [('regression excess-fraction-zeros 1', ('-999.0010', 'ch', 3), -999001),\n  ('regression excess-fraction-zeros 2', ('1.234.567,500', 'de', 2), 123456750),\n  ('partial repair guard 1', ('12345.500', 'ch', 0), 'ERR:precision'),\n  ('partial repair guard 2', ('-1234567,123', 'fr', 0), 'ERR:precision'),\n  ('control: dangling separator', ('12.', 'en', 2), 'ERR:format'),\n  ('control: unknown locale', ('12', 'it', 2), 'ERR:locale'),\n  ('control: oversized first group', ('1234,567.00', 'en', 2), 'ERR:format'),\n  ('control: english grouping', ('1,234.56', 'en', 2), 123456)],\n [('regression excess-fraction-zeros 1', ('0,500', 'fr', 2), 50),\n  ('regression excess-fraction-zeros 2', ('1.000,500', 'de', 2), 100050),\n  ('partial repair guard 1', ('999,500', 'de', 0), 'ERR:precision'),\n  ('partial repair guard 2', ('12345.123', 'en', 0), 'ERR:precision'),\n  ('control: english grouping', ('1,234.56', 'en', 2), 123456),\n  ('control: german short fraction', ('1.234,5', 'de', 2), 123450),\n  ('control: negative below one', ('-0,50', 'de', 2), -50),\n  ('control: narrow space with trailing zero', ('1\\u202f234,500', 'fr', 2), 123450)]]\nfor label, args, expected in cases[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"9432d0ceaacce46d957f5658dc6ecdb1a80ff6a1fc39a33c08a4dd715c2c5bf6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(text, locale, exp):\n    seps = {'en': (',', '.'), 'de': ('.', ','), 'ch': (\"'\", '.'), 'fr': (' \\u202f', ',')}\n    if locale not in seps: return 'ERR:locale'\n    groups, dec = seps[locale]\n    dig = lambda t: t != '' and all(c in '0123456789' for c in t)\n    s = text.strip()\n    neg = s.startswith('-')\n    if neg: s = s[1:]\n    whole, _, frac = s.partition(dec)\n    for g in groups[1:]: whole = whole.replace(g, groups[0])\n    parts = whole.split(groups[0])\n    if not all(dig(p) for p in parts) or (dec in s and not dig(frac)): return 'ERR:format'\n    if len(parts) > 1 and (len(parts[0]) > 3 or any(len(p) != 3 for p in parts[1:])): return 'ERR:format'\n    if len(frac) > exp: return 'ERR:precision'\n    frac = frac[:exp].ljust(exp, '0')\n    v = int(''.join(parts)) * 10 ** exp + (int(frac) if frac else 0)\n    return -v if neg else v\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression excess-fraction-zeros 1', ('1\\u202f234,500', 'fr', 2), 123450),\n  ('regression excess-fraction-zeros 2', ('100000,0010', 'fr', 3), 100000001),\n  ('partial repair guard 1', ('12.345', 'en', 2), 'ERR:precision'),\n  ('partial repair guard 2', ('999,50', 'fr', 0), 'ERR:precision'),\n  ('control: english grouping', ('1,234.56', 'en', 2), 123456),\n  ('control: german short fraction', ('1.234,5', 'de', 2), 123450),\n  ('control: negative below one', ('-0,50', 'de', 2), -50),\n  ('control: bad grouping', ('1,23,4.00', 'en', 2), 'ERR:format')],\n [('regression excess-fraction-zeros 1', ('-0,500', 'fr', 2), -50),\n  ('regression excess-fraction-zeros 2', ('12.345,500', 'de', 2), 1234550),\n  ('partial repair guard 1', ('999.500', 'en', 0), 'ERR:precision'),\n  ('partial repair guard 2', ('-1.000,0010', 'de', 0), 'ERR:precision'),\n  ('control: narrow space with trailing zero', ('1\\u202f234,500', 'fr', 2), 123450),\n  ('control: excess precision', ('12.345', 'en', 2), 'ERR:precision'),\n  ('control: bad grouping', ('1,23,4.00', 'en', 2), 'ERR:format'),\n  ('control: dinar fraction', ('12.5', 'en', 3), 12500)],\n [('regression excess-fraction-zeros 1', ('12345.0010', 'en', 3), 12345001),\n  ('regression excess-fraction-zeros 2', ('1\\u202f000,0010', 'fr', 3), 1000001),\n  ('partial repair guard 1', ('999,0010', 'fr', 2), 'ERR:precision'),\n  ('partial repair guard 2', ('100000.5', 'ch', 0), 'ERR:precision'),\n  ('control: dinar fraction', ('12.5', 'en', 3), 12500), ('control: swiss integer', (\"1'000\", 'ch', 0), 1000),\n  ('control: french plain space', ('12 345,6', 'fr', 2), 1234560),\n  ('control: dangling separator', ('12.', 'en', 2), 'ERR:format')],\n [('regression excess-fraction-zeros 1', ('-999.0010', 'ch', 3), -999001),\n  ('regression excess-fraction-zeros 2', ('1.234.567,500', 'de', 2), 123456750),\n  ('partial repair guard 1', ('12345.500', 'ch', 0), 'ERR:precision'),\n  ('partial repair guard 2', ('-1234567,123', 'fr', 0), 'ERR:precision'),\n  ('control: dangling separator', ('12.', 'en', 2), 'ERR:format'),\n  ('control: unknown locale', ('12', 'it', 2), 'ERR:locale'),\n  ('control: oversized first group', ('1234,567.00', 'en', 2), 'ERR:format'),\n  ('control: english grouping', ('1,234.56', 'en', 2), 123456)],\n [('regression excess-fraction-zeros 1', ('0,500', 'fr', 2), 50),\n  ('regression excess-fraction-zeros 2', ('1.000,500', 'de', 2), 100050),\n  ('partial repair guard 1', ('999,500', 'de', 0), 'ERR:precision'),\n  ('partial repair guard 2', ('12345.123', 'en', 0), 'ERR:precision'),\n  ('control: english grouping', ('1,234.56', 'en', 2), 123456),\n  ('control: german short fraction', ('1.234,5', 'de', 2), 123450),\n  ('control: negative below one', ('-0,50', 'de', 2), -50),\n  ('control: narrow space with trailing zero', ('1\\u202f234,500', 'fr', 2), 123450)]]\nfor label, args, expected in cases[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"f8599e0c44dd3df62cc4378fa9b6549755c371f0c6e6206db0894c5d93ab8cb1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(text, locale, exp):\n    seps = {'en': (',', '.'), 'de': ('.', ','), 'ch': (\"'\", '.'), 'fr': (' \\u202f', ',')}\n    if locale not in seps: return 'ERR:locale'\n    groups, dec = seps[locale]\n    dig = lambda t: t != '' and all(c in '0123456789' for c in t)\n    s = text.strip()\n    neg = s.startswith('-')\n    if neg: s = s[1:]\n    whole, _, frac = s.partition(dec)\n    for g in groups[1:]: whole = whole.replace(g, groups[0])\n    parts = whole.split(groups[0])\n    if not all(dig(p) for p in parts) or (dec in s and not dig(frac)): return 'ERR:format'\n    if len(parts) > 1 and (len(parts[0]) > 3 or any(len(p) != 3 for p in parts[1:])): return 'ERR:format'\n    if frac[exp:].strip('0'): return 'ERR:precision'\n    frac = frac[:exp].ljust(exp, '0')\n    v = int(''.join(parts)) * 10 ** exp + (int(frac) if frac else 0)\n    return -v if neg else v\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression excess-fraction-zeros 1', ('1\\u202f234,500', 'fr', 2), 123450),\n  ('regression excess-fraction-zeros 2', ('100000,0010', 'fr', 3), 100000001),\n  ('partial repair guard 1', ('12.345', 'en', 2), 'ERR:precision'),\n  ('partial repair guard 2', ('999,50', 'fr', 0), 'ERR:precision'),\n  ('control: english grouping', ('1,234.56', 'en', 2), 123456),\n  ('control: german short fraction', ('1.234,5', 'de', 2), 123450),\n  ('control: negative below one', ('-0,50', 'de', 2), -50),\n  ('control: bad grouping', ('1,23,4.00', 'en', 2), 'ERR:format')],\n [('regression excess-fraction-zeros 1', ('-0,500', 'fr', 2), -50),\n  ('regression excess-fraction-zeros 2', ('12.345,500', 'de', 2), 1234550),\n  ('partial repair guard 1', ('999.500', 'en', 0), 'ERR:precision'),\n  ('partial repair guard 2', ('-1.000,0010', 'de', 0), 'ERR:precision'),\n  ('control: narrow space with trailing zero', ('1\\u202f234,500', 'fr', 2), 123450),\n  ('control: excess precision', ('12.345', 'en', 2), 'ERR:precision'),\n  ('control: bad grouping', ('1,23,4.00', 'en', 2), 'ERR:format'),\n  ('control: dinar fraction', ('12.5', 'en', 3), 12500)],\n [('regression excess-fraction-zeros 1', ('12345.0010', 'en', 3), 12345001),\n  ('regression excess-fraction-zeros 2', ('1\\u202f000,0010', 'fr', 3), 1000001),\n  ('partial repair guard 1', ('999,0010', 'fr', 2), 'ERR:precision'),\n  ('partial repair guard 2', ('100000.5', 'ch', 0), 'ERR:precision'),\n  ('control: dinar fraction', ('12.5', 'en', 3), 12500), ('control: swiss integer', (\"1'000\", 'ch', 0), 1000),\n  ('control: french plain space', ('12 345,6', 'fr', 2), 1234560),\n  ('control: dangling separator', ('12.', 'en', 2), 'ERR:format')],\n [('regression excess-fraction-zeros 1', ('-999.0010', 'ch', 3), -999001),\n  ('regression excess-fraction-zeros 2', ('1.234.567,500', 'de', 2), 123456750),\n  ('partial repair guard 1', ('12345.500', 'ch', 0), 'ERR:precision'),\n  ('partial repair guard 2', ('-1234567,123', 'fr', 0), 'ERR:precision'),\n  ('control: dangling separator', ('12.', 'en', 2), 'ERR:format'),\n  ('control: unknown locale', ('12', 'it', 2), 'ERR:locale'),\n  ('control: oversized first group', ('1234,567.00', 'en', 2), 'ERR:format'),\n  ('control: english grouping', ('1,234.56', 'en', 2), 123456)],\n [('regression excess-fraction-zeros 1', ('0,500', 'fr', 2), 50),\n  ('regression excess-fraction-zeros 2', ('1.000,500', 'de', 2), 100050),\n  ('partial repair guard 1', ('999,500', 'de', 0), 'ERR:precision'),\n  ('partial repair guard 2', ('12345.123', 'en', 0), 'ERR:precision'),\n  ('control: english grouping', ('1,234.56', 'en', 2), 123456),\n  ('control: german short fraction', ('1.234,5', 'de', 2), 123450),\n  ('control: negative below one', ('-0,50', 'de', 2), -50),\n  ('control: narrow space with trailing zero', ('1\\u202f234,500', 'fr', 2), 123450)]]\nfor label, args, expected in cases[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic, bounded teaching model with a stipulated toy contract; it makes no claim of conformance to any real regulation, standard, or institution's rules. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-currency_rounding_and_fx_conversion-locale-amount-parsing-excess-fraction-zeros","generated_at":"2026-09-29T14:47:01.709511+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Currency amounts must be rounded at the right stage and in the right unit, or ledgers, quotes and settlements drift by minor units.","repair":"Reject only non-zero digits beyond the exponent.","root_cause":"Any fraction longer than exp is reported as ERR:precision.","sha256":"96d6565f06026eb5c0700e4b06b1b2b8fc7bf424310e80c5449ff1ec1c87d1e5","title":"Trailing zero fraction digits beyond the exponent are rejected · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.407,"exit_code":1,"observations":[{"actual":123450,"check":"regression excess-fraction-zeros 1","expected":123450,"passed":true},{"actual":100000001,"check":"regression excess-fraction-zeros 2","expected":100000001,"passed":true},{"actual":1234,"check":"partial repair guard 1","expected":"ERR:precision","passed":false},{"actual":999,"check":"partial repair guard 2","expected":"ERR:precision","passed":false},{"actual":123456,"check":"control: english grouping","expected":123456,"passed":true},{"actual":123450,"check":"control: german short fraction","expected":123450,"passed":true},{"actual":-50,"check":"control: negative below one","expected":-50,"passed":true},{"actual":"ERR:format","check":"control: bad grouping","expected":"ERR:format","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression excess-fraction-zeros 1\", \"actual\": 123450, \"expected\": 123450, \"passed\": true}, {\"check\": \"regression excess-fraction-zeros 2\", \"actual\": 100000001, \"expected\": 100000001, \"passed\": true}, {\"check\": \"partial repair guard 1\", \"actual\": 1234, \"expected\": \"ERR:precision\", \"passed\": false}, {\"check\": \"partial repair guard 2\", \"actual\": 999, \"expected\": \"ERR:precision\", \"passed\": false}, {\"check\": \"control: english grouping\", \"actual\": 123456, \"expected\": 123456, \"passed\": true}, {\"check\": \"control: german short fraction\", \"actual\": 123450, \"expected\": 123450, \"passed\": true}, {\"check\": \"control: negative below one\", \"actual\": -50, \"expected\": -50, \"passed\": true}, {\"check\": \"control: bad grouping\", \"actual\": \"ERR:format\", \"expected\": \"ERR:format\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.505,"exit_code":1,"observations":[{"actual":"ERR:precision","check":"regression excess-fraction-zeros 1","expected":123450,"passed":false},{"actual":"ERR:precision","check":"regression excess-fraction-zeros 2","expected":100000001,"passed":false},{"actual":"ERR:precision","check":"partial repair guard 1","expected":"ERR:precision","passed":true},{"actual":"ERR:precision","check":"partial repair guard 2","expected":"ERR:precision","passed":true},{"actual":123456,"check":"control: english grouping","expected":123456,"passed":true},{"actual":123450,"check":"control: german short fraction","expected":123450,"passed":true},{"actual":-50,"check":"control: negative below one","expected":-50,"passed":true},{"actual":"ERR:format","check":"control: bad grouping","expected":"ERR:format","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression excess-fraction-zeros 1\", \"actual\": \"ERR:precision\", \"expected\": 123450, \"passed\": false}, {\"check\": \"regression excess-fraction-zeros 2\", \"actual\": \"ERR:precision\", \"expected\": 100000001, \"passed\": false}, {\"check\": \"partial repair guard 1\", \"actual\": \"ERR:precision\", \"expected\": \"ERR:precision\", \"passed\": true}, {\"check\": \"partial repair guard 2\", \"actual\": \"ERR:precision\", \"expected\": \"ERR:precision\", \"passed\": true}, {\"check\": \"control: english grouping\", \"actual\": 123456, \"expected\": 123456, \"passed\": true}, {\"check\": \"control: german short fraction\", \"actual\": 123450, \"expected\": 123450, \"passed\": true}, {\"check\": \"control: negative below one\", \"actual\": -50, \"expected\": -50, \"passed\": true}, {\"check\": \"control: bad grouping\", \"actual\": \"ERR:format\", \"expected\": \"ERR:format\", \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.143,"exit_code":0,"observations":[{"actual":123450,"check":"regression excess-fraction-zeros 1","expected":123450,"passed":true},{"actual":100000001,"check":"regression excess-fraction-zeros 2","expected":100000001,"passed":true},{"actual":"ERR:precision","check":"partial repair guard 1","expected":"ERR:precision","passed":true},{"actual":"ERR:precision","check":"partial repair guard 2","expected":"ERR:precision","passed":true},{"actual":123456,"check":"control: english grouping","expected":123456,"passed":true},{"actual":123450,"check":"control: german short fraction","expected":123450,"passed":true},{"actual":-50,"check":"control: negative below one","expected":-50,"passed":true},{"actual":"ERR:format","check":"control: bad grouping","expected":"ERR:format","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression excess-fraction-zeros 1\", \"actual\": 123450, \"expected\": 123450, \"passed\": true}, {\"check\": \"regression excess-fraction-zeros 2\", \"actual\": 100000001, \"expected\": 100000001, \"passed\": true}, {\"check\": \"partial repair guard 1\", \"actual\": \"ERR:precision\", \"expected\": \"ERR:precision\", \"passed\": true}, {\"check\": \"partial repair guard 2\", \"actual\": \"ERR:precision\", \"expected\": \"ERR:precision\", \"passed\": true}, {\"check\": \"control: english grouping\", \"actual\": 123456, \"expected\": 123456, \"passed\": true}, {\"check\": \"control: german short fraction\", \"actual\": 123450, \"expected\": 123450, \"passed\": true}, {\"check\": \"control: negative below one\", \"actual\": -50, \"expected\": -50, \"passed\": true}, {\"check\": \"control: bad grouping\", \"actual\": \"ERR:format\", \"expected\": \"ERR:format\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}