2010-01-17 5 views
2

En C#, j'ai deux situations possibles dans un contrôle de zone de texte.Déterminer quelle fonction appeler en fonction de la longueur de la décimale

Les chiffres peuvent être:

a) .xxxx

ou

b) .XX

Comment puis-je écrire une condition qui dit: « Si la zone de texte a 4 décimales, puis appelez cette fonction, sinon, si la zone de texte a 2 décimales, appelez cette fonction. "

Cela semble facile, mais je ne sais pas comment évaluer les décimales.

Merci beaucoup!

+1

Si l'utilisateur entre ".1200", voulez-vous compter 4 chiffres décimaux ou 2? – DyingCactus

+0

Les 0 sont-ils significatifs? Est-ce que "3.4200" est considéré comme un numéro à 2 ou 4 places? –

+0

Merci pour les commentaires ... désolé, je n'étais pas clair. Oui, si un utilisateur saisit 1.4000, il s'agit de 4 décimales. – Woody

Répondre

2

Vous pouvez utiliser Regex

new Regex(@"\.\d{2}$").IsMatch(input.Value) 
+0

Cette expression régulière correspondra à deux * décimales ou plus *, donc ne répond pas à la question.Vous devriez utiliser l'ancre de fin de ligne '$' si vous voulez faire correspondre * exactement * deux décimales. – LukeH

+0

@Luke Merci j'ai corrigé –

1

Etat évaluera true sur deux, mais pas quatre décimales:

Math.Round(100*x) == 100*x 

EDIT: condition ci-dessus ne fonctionne que pour le type décimal. Eh bien, suite à des travaux pour les nombres réels de tous les types:

(Math.Ceiling(100 * x) - 100 * x) < 10e-8) 

EDIT: Eh bien, si vous êtes intéressé par les chaînes puis utilisez suivantes (chaîne d'extension contient dernier point et chiffres suivants/numéros):

System.IO.Path.GetExtension(input).Length 
+0

Cela fonctionne si l'OP attend un type décimal. Cependant, avec un flotteur, ce n'est pas le cas. Donc, tant que OP le vérifie en décimal, ça devrait aller. – keyboardP

+0

Alors que se passe-t-il si l'utilisateur entre 1.0000 – Stilgar

+0

Ah oui, je n'y ai pas pensé. – keyboardP

3
if(txtNumber.Text.Split(new[]{'.'})[1].Length == 2) 
{ 
    //case b 
} 
else 
{ 
    //case a 
} 

Vous pouvez utiliser le séparateur décimal de la culture actuelle du système au lieu de coder en dur le point.

2

Vous pourriez profiter d'une caractéristique très obscure du type décimal. Sa représentation interne est un nombre de 96 bits avec un exposant. L'exposant est égal au nombre de chiffres de la fraction, même si les chiffres fractionnaires sont nuls. Ainsi:

public static int GetFractionalDigits(string txt) { 
    decimal value = decimal.Parse(txt); 
    return (decimal.GetBits(value)[3] >> 16) & 0x7fff; 
} 

Utilisez decimal.TryParse() si vous avez besoin de valider l'entrée utilisateur.

1

Cela peut ne pas fonctionner parfaitement en fonction de vos besoins, mais il fonctionne à mes fins et pourrait être utile à quelqu'un d'autre.

static class MathCustom 
{ 
    static public byte NumberOfDecimals(decimal value) 
    { 
     sbyte places = -1; 
     decimal testValue; 

     do 
     { 
      places++; 
      testValue = Math.Round(value, places); 
     } while (testValue != value); 

     return (byte)places; 
    } 

    static public byte NumberOfDecimals(float value) 
    { 
     sbyte places = -1; 
     float testValue; 

     do 
     { 
      places++; 
      testValue = (float)Math.Round((decimal)value, places); 
     } while (testValue != value); 

     return (byte)places; 
    } 

    /// <summary> 
    /// This version of NumberOfDecimals allows you to provide a Maximum 
    /// for allowable decimals. This method will allow for the correction 
    /// of floating point errors when it is less than 10 or passed in as null. 
    /// </summary> 
    /// <param name="value">Value to check the number of held decimal places</param> 
    /// <param name="knownMaximum"></param> 
    /// <returns>The number of decimal places in Value.</returns> 
    static public byte NumberOfDecimals(decimal value, byte? knownMaximum) 
    { 
     byte maximum; 
     decimal localValue; 
     sbyte places = -1; 
     decimal testValue; 

     if (knownMaximum == null) 
     { 
      maximum = 9; 
     } 
     else 
     { 
      maximum = (byte)knownMaximum; 
     } 

     localValue = Math.Round(value, maximum); 

     do 
     { 
      places++; 
      testValue = Math.Round(localValue, places); 
     } while (testValue != localValue); 

     return (byte)places; 
    } 

} 
Questions connexes