Primera Respuesta:
Esto coincide con #,###,##0.00
:
^[+-]?[0-9]{1,3}(?:\,?[0-9]{3})*(?:\.[0-9]{2})?$
Y esto coincide con #.###.##0,00
:
^[+-]?[0-9]{1,3}(?:\.?[0-9]{3})*(?:\,[0-9]{2})?$
que une los dos (hay formas más inteligentes/cortos de escribirlo, pero funciona):
(?:^[+-]?[0-9]{1,3}(?:\,?[0-9]{3})*(?:\.[0-9]{2})?$)
|(?:^[+-]?[0-9]{1,3}(?:\.?[0-9]{3})*(?:\,[0-9]{2})?$)
También puede agregar un grupo de captura a la última coma (o punto) para verificar cuál se utilizó.
Segunda respuesta:
Como se señaló por Alan M, mi solución anterior podía dejar de rechazar un valor como 11,111111.00
donde falta una coma, pero el otro no lo es. Después de algunas pruebas llegué a la siguiente expresión regular que evita este problema:
^[+-]?[0-9]{1,3}
(?:(?<comma>\,?)[0-9]{3})?
(?:\k<comma>[0-9]{3})*
(?:\.[0-9]{2})?$
Esto merece alguna explicación:
^[+-]?[0-9]{1,3}
coincide con la primera (1 a 3) dígitos;
(?:(?<comma>\,?)[0-9]{3})?
coincide en una coma opcional seguida de más de 3 dígitos, y captura la coma (o la inexistencia de una) en un grupo llamado 'coma';
(?:\k<comma>[0-9]{3})*
coincide con cero-a-cualquier repetición de la coma utilizada anteriormente (si la hay) seguida de 3 dígitos;
(?:\.[0-9]{2})?$
coincide con "centavos" opcionales al final de la cadena.
Por supuesto, que sólo cubrirá #,###,##0.00
(no #.###.##0,00
), pero siempre se puede unirse a las expresiones regulares como lo hice anteriormente.
respuesta final:
Ahora, una solución completa. Las sangrías y los saltos de línea están ahí para la legibilidad solamente.
^[+-]?[0-9]{1,3}
(?:
(?:\,[0-9]{3})*
(?:.[0-9]{2})?
|
(?:\.[0-9]{3})*
(?:\,[0-9]{2})?
|
[0-9]*
(?:[\.\,][0-9]{2})?
)$
Y esta variación captura los separadores utilizados:
^[+-]?[0-9]{1,3}
(?:
(?:(?<thousand>\,)[0-9]{3})*
(?:(?<decimal>\.)[0-9]{2})?
|
(?:(?<thousand>\.)[0-9]{3})*
(?:(?<decimal>\,)[0-9]{2})?
|
[0-9]*
(?:(?<decimal>[\.\,])[0-9]{2})?
)$
editar 1: "centavos" ahora son opcionales; editar 2: texto agregado; editar 3: segunda solución agregada; edit 4: solución completa agregada; editar 5: encabezados agregados; editar 6: captura añadida; editar 7: la última respuesta se rompió en dos versiones;
solo por curiosidad, ¿por qué alguna vez tendrías un patrón como: 11.111.111, que es el reverso del valor real (111,111.11) – ennuikiller
Solo para hacer esta prueba de idiotas. Para que los usuarios no tengan que recordar cuál es el patrón correcto – LuRsT
Eso es realmente bastante inteligente, ya que hay muchos países en el mundo que usan la coma como un separador decimal. Para obtener una lista, consulte aquí: http://en.wikipedia.org/wiki/Decimal_separator#Countries_using_Arabic_numerals_with_decimal_comma –