Germany’s 5-digit Postleitzahl (PLZ) is one of the cleanest postal-code formats in the world — no letters, no spaces, exactly five decimal digits — yet it trips up developers and data-entry staff in one subtle but costly way: codes in the range 01001–09999 carry a leading zero. The moment a PLZ is cast to an integer (or stored in a numeric database column), that zero disappears and the code becomes invalid. This validator enforces the correct string representation, checks every digit, and maps the code to its official Deutsche Post sorting district so you know both whether the format is right and where in Germany the code belongs.
How it works
German postcode validation follows a three-step logic:
Step 1 — Character check. A PLZ must consist of exactly 5 decimal digits (0–9). Letters, spaces, hyphens and other punctuation are all illegal. This single rule rejects the majority of garbage input immediately.
Step 2 — Length check. The length must be precisely 5. A 4-digit input almost certainly has a stripped leading zero; a 6-digit input is not a PLZ at all. Both are flagged with an explicit message explaining what went wrong.
Step 3 — Leitregion lookup. Deutsche Post divides Germany into roughly 83 Leitregionen (sorting regions), each identified by the first two digits of its PLZ range. The validator matches the first two digits of your input against the complete official table and reports the Bundesland (federal state) and the named postal region (for example, “80” maps to Bavaria / Munich central, “10” maps to Berlin inner west). If the two-digit prefix does not appear in the table, the input is flagged as unrecognised — it may be a real code in a sub-range not covered by the table, or it may be a typo.
The first digit alone provides a rough compass bearing: 0 = eastern states, 1 = Berlin/Brandenburg, 2–3 = north, 4–5 = North Rhine-Westphalia, 6 = Hesse and Rhine, 7 = Baden-Württemberg, 8 = Bavaria south, 9 = Bavaria north.
Worked example
Suppose a user submits the postcode 80331:
- Length: 5 digits — correct.
- All characters are digits — correct.
- First digit “8” — Bavaria, Munich region.
- Leitregion “80” — Bavaria, Munich central (sorted at the Munich distribution centre).
- Result: valid. The code belongs to Munich’s historic Altstadt-Lehel district, one of the most recognisable postcodes in Germany.
Now suppose the input is 1115 (four digits):
- Length: 4 — too short.
- Likely cause: a leading zero was stripped, turning 01115 (a Berlin code) into 1115.
- Fix: store and transmit PLZs as strings, not integers.
| PLZ | State | Region | Notes |
|---|---|---|---|
| 10115 | Berlin | Berlin inner west | Mitte, government quarter |
| 20095 | Hamburg | Hamburg central | City centre |
| 80331 | Bavaria | Munich central | Altstadt |
| 01001 | Saxony | Dresden | Leading zero — must stay as string |
| 50667 | NRW | Cologne | Cathedral district |
| 60311 | Hesse | Frankfurt am Main | City centre |
All validation runs in your browser. No postcode is ever uploaded or logged.