2009-11-18 7 views
3

Je dois écrire une validation pour une zone de texte dont la valeur est < = 2147483647analyse syntaxique Entier

mon code est quelque chose comme:

Textbox1.Text = "78987162789" 

if(Int32.Parse(Textbox1.text) > 2147483647) 
{ 
    Messagebox("should not > ") 
} 

j'obtiens un message d'erreur quelque chose comme: value is too small or too big for Int. Comment puis-je réparer cela?

+0

Vous pouvez utiliser des constantes, telles que int32.MaxValue, au lieu de les coder en dur. – MPelletier

Répondre

5

Il existe une méthode TryParse qui convient mieux à cette fin.

int Val; 
bool ok = Int32.TryParse (Textbox1.Text, out Val); 
if (!ok) { ... problem occurred ... } 
+0

Vous manquez le "out" sur le deuxième paramètre ... –

+0

@paxdiablo - je veux voter vers le haut aussi mais je n'ai pas de points. Merci pour votre réponse. – SattiS

0
Int64 result; 
if (!Int64.TryParse(Textbox1.Text, out result)) 
{ 
    // The value is not a number or cannot be stored in a 64-bit integer. 
} 
else if (result > (Int64)Int32.MaxValue) 
{ 
    // The value cannot be stored in a 32-bit integer. 
} 
+0

Quelle est la valeur de la condition 'else if'? –

+0

Je ne comprends pas votre question. – ChaosPandion

+0

@Chaos: Je pense qu'il veut dire, "quelle est la valeur ajoutée d'effectuer ce contrôle supplémentaire?" Notez également qu'un succès Int64.TryParse ne garantit pas que la valeur est un nombre, comme le suggère votre commentaire. –

0

L'erreur se produit parce 78987162789 est supérieure à 2^31, il est donc trop grand pour un Int32. Comme suggéré, utilisez la méthode TryParse et ne continuez que si elle renvoie true.

3

Les entiers sont stockés en utilisant 32 bits, vous n'avez donc que 32 bits pour représenter vos données; 31 une fois que vous prenez en compte les nombres négatifs. Les nombres supérieurs à 2^31 - 1 ne peuvent donc pas être représentés comme des nombres entiers. Ce nombre est 2147483647. Donc depuis 78987162789> 2147483648, il ne peut pas le convertir en nombre entier.

Essayez à la place d'utiliser un long.

Edit:

Bien sûr, long ne fonctionne que jusqu'à 9,223,372,036,854,775,807 (2^63-1), de sorte que vous pouvez retrouver dans le même problème. Donc, comme d'autres personnes l'ont suggéré, utilisez Int32.TryParse - si cela échoue, vous pouvez supposer que ce n'est pas un nombre, ou c'est plus grand que votre limite.

+1

+1 pour 'long' ... –

+0

Et lorsque l'utilisateur entre 3742643647634537643465346534634535453563453563635353 dans la zone de texte? – paxdiablo

+0

J'espère que ce nombre entré au hasard est supérieur à (2^63) -1 ou je vais avoir l'air assez idiot :-) – paxdiablo

0

Vous pouvez utiliser l'événement Validating.

private void textbox1_Validating(object sender, CancelEventArgs e) 
{ 
    try 
    { 
     Int64 numberEntered = Int64.Parse(textBox1.Text); 
     if (numberEntered > 2147483647) 
     { 
      e.Cancel = true; 
      MessageBox.Show("You have to enter number up to 2147483647"); 
     } 
    } 
    catch (FormatException) 
    { 
     e.Cancel = true; 
     MessageBox.Show("You need to enter a valid integer"); 
    } 
} 



    private void InitializeComponent() 
    { 

     // 
     // more code 
     // 
     this.Textbox1.Validating += new System.ComponentModel.CancelEventHandler(this.textbox1_Validating); 
    }