Preciso que um texto como "joe ($ 3.004,50)" seja filtrado para 3004,50, mas sou péssimo em regex e não consigo encontrar uma solução adequada. Portanto, apenas números e períodos devem permanecer - todo o resto filtrado. Eu uso o framework C # e VS.net 2008 3.5
93
joe.smith ($3,004.50)
? Simplesmente remover classes de personagens ofensivas pode dar errado.Regex.Replace(s, "[^$0-9.]", "");
você quer deixar o cifrão.O regex é:
Você pode armazenar em cache o regex:
então use:
No entanto, você deve ter em mente que algumas culturas têm convenções diferentes para escrever valores monetários, como: 3,004,50.
fonte
.
não tem nenhum significado especial.Para a resposta aceita, MatthewGunn levanta um ponto válido em que todos os dígitos, vírgulas e pontos na string inteira serão condensados juntos. Isso evitará que:
fonte
(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)
também corresponderá a "h25" na string "joe.smith25 ($ 3.004,50)"A abordagem de remover personagens ofensivos é potencialmente problemática. E se houver outro
.
na corda em algum lugar? Não será removido, embora deva!Removendo não dígitos ou pontos, a string
joe.smith ($3,004.50)
se transformaria no não analisável.3004.50
.Imho, é melhor corresponder a um padrão específico e extraí-lo usando um grupo. Algo simples seria encontrar todas as vírgulas, dígitos e pontos contíguos com regexp:
Teste de amostra executado:
Em seguida, para cada correspondência, remova todas as vírgulas e envie para o analisador. Para lidar com o caso de algo como
12.323.344
, você pode fazer outra verificação para ver se uma substring correspondente tem no máximo um.
.fonte
""
.Single.Parse()
ouSingle.TryParse
?Você está lidando com uma string - string é um
IEumerable<char>
, então você pode usar LINQ:fonte