Necesito que un texto como "joe ($ 3,004.50)" se filtre a 3004.50 pero soy terrible con las expresiones regulares y no puedo encontrar una solución adecuada. Por lo tanto, solo deben permanecer los números y los puntos, todo lo demás filtrado. Yo uso C # y VS.net 2008 framework 3.5
95
joe.smith ($3,004.50)
? Simplemente eliminar las clases de personajes ofensivos puede salir mal.Regex.Replace(s, "[^$0-9.]", "");
quieres dejar el signo del dólar.La expresión regular es:
Puede almacenar en caché la expresión regular:
luego usa:
Sin embargo, debe tener en cuenta que algunas culturas tienen diferentes convenciones para escribir cantidades monetarias, como: 3.004,50.
fuente
.
no tiene un significado especial.Para la respuesta aceptada, MatthewGunn plantea un punto válido en el sentido de que todos los dígitos, comas y puntos de toda la cadena se condensarán. Esto evitará que:
fuente
(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)
también coincidirá con "h25" en la cadena "joe.smith25 ($ 3,004.50)"El enfoque de eliminar personajes ofensivos es potencialmente problemático. ¿Qué pasa si hay otro
.
en la cuerda en alguna parte? ¡No se eliminará, aunque debería!Al eliminar los no dígitos o puntos, la cadena
joe.smith ($3,004.50)
se transformaría en lo que no se puede analizar.3004.50
.En mi humilde opinión, es mejor hacer coincidir un patrón específico y extraerlo usando un grupo. Algo simple sería encontrar todas las comas, dígitos y puntos contiguos con regexp:
Ejecución de prueba de muestra:
Luego, para cada coincidencia, elimine todas las comas y envíelo al analizador. Para manejar el caso de algo como
12.323.344
, podría hacer otra verificación para ver que una subcadena coincidente tenga como máximo una.
.fuente
""
.Single.Parse()
oSingle.TryParse
?Está tratando con una cadena, la cadena es una
IEumerable<char>
, por lo que puede usar LINQ:fuente