Los formatos de códigos postales no son intercambiables, y un validador que asume cinco dígitos rechazará la mayor parte del mundo. Las diferencias son estructurales, no cosméticas: algunos sistemas son numéricos con ceros a la izquierda, otros mezclan letras y dígitos, algunos colocan el código antes de la ciudad, y dos países del conjunto de datos de ejemplo de este sitio no tienen códigos postales en absoluto.
Esta referencia recopila los patrones que importan para un desarrollador que construye un formulario de dirección, con regex que puede probar directamente. También traza la misma línea que traza el sitio: la validación postal aquí es una comprobación de estructura para todos los países, más una comprobación de existencia para los ZIP de EE. UU. contra un conjunto de datos de 40.979 filas. Nada en esta guía implica que un código coincidente esté asignado o sea entregable.
Por qué los códigos postales no son un campo numérico
Estados Unidos usa cinco dígitos o ZIP+4, lo que tienta a los desarrolladores a modelar los códigos postales como enteros. Ese modelo se rompe de inmediato en Canadá, el Reino Unido, los Países Bajos, Irlanda, Malta y Argentina, donde las letras forman parte del código. También se rompe silenciosamente en Alemania, Francia, España, Italia y Polonia, donde los ceros a la izquierda son significativos y una columna entera los elimina.
Una segunda clase de errores proviene de la posición. La mayoría de los países occidentales colocan el código postal después de la ciudad, pero Alemania, Francia, los Países Bajos y Japón lo colocan antes de la ciudad, y Japón pone el código completo al principio mismo de la dirección. Si su formulario renderiza una plantilla fija, producirá direcciones que un lector local encontrará obviamente incorrectas aunque todos los campos estén completados.
- Almacene siempre los códigos postales como texto, nunca como enteros
- Mantenga los ceros a la izquierda intactos en todas las capas, incluida la exportación a CSV
- Permita letras a menos que el país sea estrictamente numérico
- No asuma que el código postal va después de la ciudad
- Trate el separador como presentación, no como estructura
Sistemas numéricos y sus rangos
La mayor parte de Europa usa códigos numéricos de longitud fija. Alemania, Francia, España, Italia, Grecia, Turquía y Arabia Saudita usan cinco dígitos; Austria, Bélgica, Suiza, Dinamarca, Noruega, Hungría y Sudáfrica usan cuatro; Polonia y Portugal añaden un guion; Suecia usa tres dígitos, un espacio y dos. Chequia usa cinco dígitos que normalmente se escriben con un espacio después del tercero.
Asia y América Latina son mayoritariamente numéricos pero con longitudes diferentes. India, China, Rusia, Singapur y Nigeria usan seis dígitos; Japón usa siete con un guion convencional después del tercero; Corea del Sur usa cinco; Brasil usa ocho con un guion después del quinto; Chile usa siete; Colombia usa seis; Perú y México usan cinco. La longitud por sí sola no basta para identificar un país, por lo que un validador necesita el campo de país antes de validar cualquier cosa.
| País | Longitud | Forma canónica | Regex |
|---|---|---|---|
| Alemania | 5 dígitos | 10115 | ^\d{5}$ |
| Francia | 5 dígitos | 75008 | ^\d{5}$ |
| España | 5 dígitos | 28013 | ^\d{5}$ |
| Austria | 4 dígitos | 1010 | ^\d{4}$ |
| Polonia | 5 dígitos con guion | 00-001 | ^\d{2}-\d{3}$ |
| Portugal | 7 dígitos con guion | 1250-096 | ^\d{4}-\d{3}$ |
| Suecia | 5 dígitos con espacio | 114 55 | ^\d{3}\s\d{2}$ |
| Japón | 7 dígitos con guion | 100-0001 | ^\d{3}-\d{4}$ |
| Brasil | 8 dígitos con guion | 01310-100 | ^\d{5}-\d{3}$ |
| India | 6 dígitos | 110001 | ^\d{6}$ |
| Corea del Sur | 5 dígitos | 04524 | ^\d{5}$ |
| México | 5 dígitos | 06600 | ^\d{5}$ |
Sistemas alfanuméricos y sus reglas de caracteres
Canadá usa el patrón A1A 1A1, y las letras están restringidas. El primer carácter no puede ser D, F, I, O, Q, U, W ni Z, y las letras restantes no pueden ser D, F, I, O, Q ni U. El espacio entre los dos tríos es convencional. Un validador que permita cualquier letra aceptará códigos que Canada Post nunca emite.
El Reino Unido usa un código exterior de dos a cuatro caracteres seguido de un solo espacio y un código interior de tres caracteres, como SW1A 1AA. Los Países Bajos son cuatro dígitos, un espacio y dos letras mayúsculas. Irlanda usa un Eircode de siete caracteres dividido en una clave de enrutamiento de tres caracteres y un identificador único de cuatro caracteres. Malta es tres letras, un espacio y cuatro dígitos. Argentina usa el CPA de ocho caracteres, una letra seguida de cuatro dígitos y tres letras, por ejemplo C1425ABC.
| País | Patrón | Ejemplo | Regex |
|---|---|---|---|
| Canadá | A1A 1A1 con letras restringidas | K1A 0B1 | ^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] ?\d[ABCEGHJKLMNPRSTVWXYZ]\d$ |
| Reino Unido | Exterior de 2-4 caracteres, interior de 3 | SW1A 1AA | ^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$ |
| Países Bajos | 4 dígitos, 2 letras | 1012 AB | ^\d{4} ?[A-Z]{2}$ |
| Irlanda | Clave de enrutamiento de 3 caracteres, identificador de 4 | D02 X285 | ^(?:[A-Z]\d{2}|D6W) ?[A-Z0-9]{4}$ |
| Malta | 3 letras, 4 dígitos | VLT 1117 | ^[A-Z]{3} ?\d{4}$ |
| Argentina | Letra, 4 dígitos, 3 letras | C1425ABC | ^[A-Z]\d{4}[A-Z]{3}$ |
Países sin código postal
Hong Kong y los Emiratos Árabes Unidos no tienen sistema de códigos postales. Ambos están en el conjunto de datos de ejemplo de 38 países de este sitio, y el generador devuelve un valor postal vacío para ellos en lugar de inventar dígitos. Este es el comportamiento correcto y también un caso de prueba útil, porque un formulario que marca el código postal como obligatorio está roto para ambos mercados.
La convención de los EAU es un número de apartado postal (P.O. Box), que no es un código postal y no debe forzarse en ese campo. Las direcciones de Hong Kong usan el distrito y la calle, y el correo se entrega sin ningún código. Si su modelo de datos requiere un valor postal no nulo, use un centinela explícito como una marca a nivel de país, no un código falso, porque un código falso pasará la validación y luego fallará en todas las comprobaciones posteriores que asumen uno real.
- Hong Kong: sin código postal, el distrito más la calle es la dirección
- Emiratos Árabes Unidos: sin código postal, el P.O. Box es la convención común
- Haga opcional el campo postal cuando se seleccione cualquiera de los dos países
- Nunca sustituya 00000 o N/A en una columna postal
- Registre la ausencia de forma explícita para que las exportaciones no parezcan datos faltantes
Comprobaciones de estructura frente a comprobaciones de existencia
Una comprobación de estructura responde si una cadena coincide con el patrón del país. Una comprobación de existencia responde si el código aparece en un conjunto de datos de referencia. Solo la segunda puede decirle que un código nunca fue asignado. Este sitio realiza la comprobación de estructura para los 38 países y una comprobación de existencia para los ZIP de EE. UU. contra 40.979 filas, y las etiqueta de forma diferente para que nadie confunda una con la otra.
Ninguna de las dos comprobaciones demuestra entregabilidad. Un ZIP de EE. UU. de cinco dígitos puede existir mientras que la dirección postal debajo de él no, y un código alemán estructuralmente válido puede pertenecer a una ciudad diferente de la proporcionada. Si necesita ese nivel de garantía, necesita un conjunto de datos de referencia postal y una base de datos a nivel de calle, que es un producto diferente de un verificador de formato.
| Tipo de comprobación | Cubre | Demuestra | No demuestra |
|---|---|---|---|
| Coincidencia de patrón | Los 38 países | Bien formado para ese país | Que el código esté asignado |
| Existencia de ZIP de EE. UU. | 40.979 filas de ZIP de EE. UU. | Que el código está en el conjunto de datos | Coincidencia de ciudad o calle |
| Regla de campo obligatorio | Nivel de formulario | Que el envío puede continuar | Ninguna validez en el mundo real |
| Longitud y conjunto de caracteres | Nivel de campo | Que el almacenamiento no se desbordará | Corrección del país |
Detalles de regex que causan errores en producción
Ancle cada patrón. Un /\d{5}/ sin anclar coincide con los cinco dígitos dentro de una cadena de nueve dígitos e informa éxito. Use ^ y $, o la API equivalente de coincidencia completa. En JavaScript, \d coincide solo con dígitos ASCII; en Python, \d coincide con dígitos Unicode de forma predeterminada, por lo que un patrón puede aceptar numerales árabes orientales a menos que compile con re.ASCII o escriba [0-9].
Decida explícitamente si el separador es obligatorio. Para la visualización, inserte usted mismo el separador canónico. Para la entrada, acepte cero o un espacio o guion y normalice. Tenga cuidado con los guiones dentro de las clases de caracteres, donde definen rangos a menos que se escapen o se coloquen al final. Y no use una bandera de insensibilidad a mayúsculas para tapar un error de normalización: convierta el valor a mayúsculas al escribir y mantenga la forma de visualización canónica.
- Ancle con ^ y $, o use una función de coincidencia completa
- Use [0-9] cuando quiera decir dígitos ASCII
- Acepte separadores opcionales en la entrada, emita separadores canónicos en la visualización
- Escape los guiones o colóquelos al final dentro de una clase de caracteres
- Convierta a mayúsculas antes de comparar en lugar de dispersar banderas de mayúsculas
- Rechace explícitamente los espacios de no separación y los caracteres de ancho cero
Normalizar al escribir, formatear al mostrar
Almacene una forma canónica y derive la forma de visualización. La forma canónica suele ser mayúsculas con el separador estándar, o solo dígitos cuando el separador es puramente convencional. Mantenga la entrada original del usuario en una columna separada si necesita una pista de auditoría, porque la normalización es con pérdida y un agente de soporte puede necesitar ver exactamente lo que se escribió.
La normalización específica por país es pequeña pero real. Canadá quiere una letra mayúscula, un dígito, una letra, un espacio, un dígito, una letra y un dígito. Los Países Bajos quieren letras mayúsculas después de los dígitos. El Reino Unido quiere un solo espacio y mayúsculas. Brasil y Japón usan un guion que los usuarios suelen omitir, así que normalice a la forma con guion. Alemania no quiere ningún separador y debe conservar el cero a la izquierda.
| País | Entrada original | Canónico almacenado | Visualización |
|---|---|---|---|
| Canadá | k1a0b1 | K1A 0B1 | K1A 0B1 |
| Países Bajos | 1012ab | 1012 AB | 1012 AB |
| Reino Unido | sw1a1aa | SW1A 1AA | SW1A 1AA |
| Brasil | 01310100 | 01310-100 | 01310-100 |
| Japón | 1000001 | 100-0001 | 100-0001 |
| Alemania | 10115 | 10115 | 10115 |
| Suecia | 11455 | 114 55 | 114 55 |
Un corpus de pruebas que puede copiar
Todo validador necesita un corpus con al menos un caso válido y uno inválido por país, además de casos que prueben específicamente la normalización y el almacenamiento. La tabla siguiente es un conjunto inicial. Observe que varios casos inválidos son inválidos por razones específicas del país en lugar de genéricas, que es donde la mayoría de las pruebas escritas a mano se detienen demasiado pronto.
Añada casos para los países sin código postal, para los ceros a la izquierda y para las variantes de separador que los usuarios realmente escriben. Si el validador se comparte entre cliente y servidor, ejecute el mismo corpus contra ambas implementaciones; una divergencia entre un cliente permisivo y un servidor estricto es la fuente más común de informes de «el formulario lo aceptó pero la API lo rechazó».
| Caso | Valor | País | Esperado |
|---|---|---|---|
| ZIP+4 válido | 97205-2515 | Estados Unidos | Aceptar |
| ZIP+4 inválido | 97205-251 | Estados Unidos | Rechazar |
| Canadiense válido | K1A 0B1 | Canadá | Aceptar |
| Letra canadiense no válida | D1A 0B1 | Canadá | Rechazar |
| Británico válido | SW1A 1AA | Reino Unido | Aceptar |
| Interior británico faltante | SW1A | Reino Unido | Rechazar |
| Cero a la izquierda alemán | 01067 | Alemania | Aceptar y conservar |
| Letras en un sistema numérico | 1011A | Alemania | Rechazar |
| Sin código | Hong Kong | Aceptar como vacío | |
| Código inventado | 99999 | Emiratos Árabes Unidos | Rechazar el campo |
Preguntas
- Hong Kong y los Emiratos Árabes Unidos no tienen ninguno, y ambos están en el conjunto de datos de ejemplo de 38 países de este sitio. El generador devuelve un campo postal vacío para ellos en lugar de inventar un valor.
- No. Una coincidencia estructural solo significa que el valor está bien formado. Aquí solo los ZIP de EE. UU. reciben una comprobación de existencia, contra 40.979 filas, y ningún país recibe una afirmación de entregabilidad.
- Nunca. Canadá, el Reino Unido, los Países Bajos, Irlanda, Malta y Argentina usan letras, y Alemania, Francia, España, Italia y Polonia tienen ceros a la izquierda significativos.
- El código neerlandés son cuatro dígitos seguidos de dos letras mayúsculas, por ejemplo 1012 AB. Las letras forman parte del código, no son un sufijo de región, y una regex de solo dígitos rechaza direcciones válidas.
- Acepte la entrada con cero o un espacio, conviértala a mayúsculas y almacene un único separador canónico. Emita la forma canónica para la visualización en lugar de repetir lo que el usuario escribió.
¿Qué países no tienen códigos postales?+
¿Un código postal válido significa que la dirección es real?+
¿Deben almacenarse los códigos postales como enteros?+
¿Por qué los Países Bajos ponen letras después de los dígitos?+
¿Cómo debo manejar el espacio en un código británico o canadiense?+
Los ejemplos son sintéticos. No utilices una dirección generada para verificaciones de identidad, registro de cuentas ni entregas.