2010-11-23 34 views
1

Est-ce correct de convertir la chaîne en float avec deux décimales?Chaîne à flotter avec deux décimales en C#

string s1 = "9.09"; 
    string s2= "99,09"; 
    string s3= ",09"; 

    ConvertToFloat(s1); 
    ConvertToFloat(s2); 
    ConvertToFloat(s3); 

    private float ConvertToFloat(string value) 
    { 
     float result; 
     decimal de= Convert.ToDecimal(value); 
     bool IsDecimalFormat = IsDecimal(de); 
     if (IsDecimalFormat) 
     { 
      result =Convert.ToSingle(value); 
     } 
     else 
     { 
      result = Convert.ToSingle(value)/100; 
     } 
     return result; 
     } 
    } 

    private bool IsDecimal(decimal myDec) 
    { 
     return (Decimal.Ceiling(myDec) > myDec) ? true : false; 
    } 
+2

Vous avez un mélange de "." et "," dans vos données d'échantillon. Voulez-vous que les deux soient considérés comme des points décimaux? Fondamentalement c'est une fonction très déroutante, retournant parfois 1/100ème de la valeur. En outre, si vous êtes intéressé par les décimales, vous devriez presque certainement utiliser 'decimal' partout plutôt que' float'. –

+0

Je suppose que '/ 100' est destiné à soutenir l'internationalisation -' "99,09" '-> 9909 -> 99.09. Je suis assez sûr qu'il échoue pour l'entrée '" 99 "'. – Kobi

Répondre

2

Si vous voulez décimales, la manière correcte est de retourner un decimal. Un float n'a pas ont décimales.

0

Voici comment je Code ConvertToFloat:

private float ConvertToFloat(string value) { 
    if (!Validate(value)) 
     throw new ArgumentException (value); 

    string[] v = value.Split(new char[] {'.', ','}); 
    int integer = 0; 
    if (!string.IsNullOrEmpty(v[0])) { 
     integer = Convert.ToInt32(v[0]); 
    } 
    int dec = Convert.ToInt32(v[1]); 
    return integer + (dec/100.0f); 
} 

EDIT

I Ajout de la méthode de validation.

public static bool Validate(string a) 
{ 
    return Regex.IsMatch(a, @"^\d*[\.,]\d{2}$"); 
} 
+0

Que faire si l'entrée était '1,000,5'? – Kobi

+0

Ceci est le code de conversion, la validation de la chaîne est la tâche 'IsDecimal'. De toute façon, il est facile de créer une expression rationnelle qui le vérifie. – Simone

0

Comme John l'a fait remarquer, si vous avez "." et "," dans vos données d'échantillon, alors vous pourriez envisager d'utiliser decimal.Parse(value, CultureInfo.xxx avec les cultures autorisées.