View Full Version : Regex com decimais em C# - Resolvido!


candycane
07-08-2008, 20:15
Boa tarde! :)

estou a tentar usar o regex para ter a certeza que o nº introduzido pelo utilizador coincide com o campo da base de dados.

Só que não consigo encontrar a expressão certa para tal.

O que pretendo é:

que o o numero seja decimal com 4 digitos antes do . ou , e depois 2 digitos, ou seja, o numero tem que ser no maximo assim:

4444.22 ou 4444,22


o codigo que tenho é este, mas não funciona :( Tmabém da-me um erro no IsMatch...


string verifica = "[0-9]{4}.[0-9]{2}";
if (Regex.IsMatch(verifica))
{
}

AliFromCairo
07-08-2008, 20:30
Boas, estás a utilizar o método estático da classe Regex que recebe dois argumentos: a expressão regular e a string que queres testar. Tu estás a passar apenas um argumento.

Alternativamente, podes criar uma nova instância da classe Regex passando a expressão regular no construtor, sendo que em seguida podes utilizar o método IsMatch passando a string a testar como argumento.

Kayvlim
07-08-2008, 20:32
Eu ainda não sei trabalhar com regexps, e não sei trabalhar com C#, mas isso do IsMatch, não tens de lhe passar uma regular expression e uma string a avaliar? É que em Perl seria algo como if($string =~ /regexp/), porque estás a fazer um match da string $string com a regular expression /regexp/. Onde é que está a dita string aí?

Espero ter-me feito entender :x

edit - ok, foi o que o AliFromCairo (http://www.techzonept.com/member.php?u=62945) disse :P

sapropel
07-08-2008, 22:10
não falta aí um ".|," para aceitar ponto ou virgula?
não tenho a certeza se é assim, sou uma nodoa em expressoes regulares.

slack_guy
07-08-2008, 22:22
Será assim?

"^\d{4}[,.]\d{2}$"

candycane
07-08-2008, 22:45
Eu ainda não sei trabalhar com regexps, e não sei trabalhar com C#, mas isso do IsMatch, não tens de lhe passar uma regular expression e uma string a avaliar? É que em Perl seria algo como if($string =~ /regexp/), porque estás a fazer um match da string $string com a regular expression /regexp/. Onde é que está a dita string aí?

Espero ter-me feito entender :x

edit - ok, foi o que o AliFromCairo (http://www.techzonept.com/member.php?u=62945) disse :P


entendi sim obrigada :)

candycane
07-08-2008, 22:50
eu ja consegui que o isMatch funcione, mas não atino é com a expressão :(

tenho assim:


Regex teste = new Regex("^\\d{4}.\\d{2}$");

if (!teste.IsMatch(txt.Text))
{
MessageBox.Show("Não é decimal.", "msg erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
MessageBox.Show("É decimal.", "msg erro", MessageBoxButtons.OK);

}




diz sempre que n é decimal :(

candycane
07-08-2008, 22:57
Será assim?

"^\d{4}[,.]\d{2}$"


também não da :(

AliFromCairo
07-08-2008, 23:02
Hmm, falta-te apenas a vírgula nessa expressão (para a incluires, vê a expressão regular que o slack_guy colocou acima).

Como está, deveria aceitar "4444.20", por exemplo. Verifica se o valor de txt.Text não tem espaços ou substitui txt.Text por txt.Text.Trim() para os suprimir.

candycane
07-08-2008, 23:09
O problema é k so me aceita numero to tipo 4444.22, se for 444 ou 4.2 já n aceita :(

AliFromCairo
07-08-2008, 23:19
Sim, mas isso é uma expressão regular diferente :007:. Ficaria algo deste género:


"^\\d{1,4}([.,]\\d{1,2})?$"


Não estou a considerar casos como ".20" ou "20.", mas também podem ser facilmente incluídos.

candycane
07-08-2008, 23:31
Sim, mas isso é uma expressão regular diferente :007:. Ficaria algo deste género:


"^\\d{1,4}([.,]\\d{1,2})?$"
Não estou a considerar casos como ".20" ou "20.", mas também podem ser facilmente incluídos.


Perfeito!!! :)

so modifiquei o 1,4 e o 1,2

"^\\d{0,4}([,.]\\d{0,2})?$";

Obrigada :)

AliFromCairo
07-08-2008, 23:44
Mas repara que assim a tua expressão vai aceitar uma string que tenha apenas o caractér "." ou "," :007:. Uma maneira simples de resolveres isso é obrigares a tua string a ter dígitos, utilizando o operador de lookahead ((?=\d+)). Algo deste género:


"^(?=\\d+)\\d{0,4}([.,]\\d{0,2})?$"
Este operador vai garantir que todos os inputs válidos têm de ter dígitos.

candycane
07-08-2008, 23:49
Ahhh por acaso n tinha testado so com . ou , lolol

brigada pela dica! :D