web-dev-qa-db-fra.com

Conversion de chaîne en double en C #

J'ai une longue chaîne avec des valeurs de type double séparées par # -value1#value2#value3# etc.

Je l'ai divisé en table de chaîne. Ensuite, je veux convertir chaque élément de cette table en caractères doubles et obtenir une erreur. Quel est le problème avec la conversion de type ici?

string a = "52.8725945#18.69872650000002#50.9028073#14.971600200000012#51.260062#15.5859949000000662452.23862099999999#19.372202799999250800000045#51.7808372#19.474096499999973#";
string[] someArray = a.Split(new char[] { '#' });
for (int i = 0; i < someArray.Length; i++)
{
    Console.WriteLine(someArray[i]); // correct value
    Convert.ToDouble(someArray[i]); // error
}
43
whoah

Il y a 3 problèmes.

1) Séparateur décimal incorrect

Différentes cultures utilisent différents séparateurs décimaux (à savoir , et .). 

Si vous remplacez . par ,, cela devrait fonctionner normalement:

Console.WriteLine(Convert.ToDouble("52,8725945"));

Vous pouvez analyser vos doubles en utilisant une méthode surchargée qui prend la culture en second paramètre. Dans ce cas, vous pouvez utiliser InvariantCulture ( Quelle est la culture invariante ) par exemple. en utilisant double.Parse:

double.Parse("52.8725945", System.Globalization.CultureInfo.InvariantCulture);

Vous devriez également jeter un coup d'œil à double.TryParse , vous pouvez l'utiliser avec de nombreuses options et il est particulièrement utile de vérifier si votre chaîne est valide double.

2) Vous avez un double incorrect

Une de vos valeurs est incorrecte car elle contient deux points:

15.5859949000000662452.23862099999999

3) Votre tableau a une valeur vide à la fin, ce qui est un double incorrect

Vous pouvez utiliser Split surchargé qui supprime les valeurs vides:

string[] someArray = a.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);

124
Zbigniew

La plupart des gens ont déjà essayé de répondre à vos questions.
Si vous êtes toujours en train de déboguer, avez-vous pensé à utiliser:

Double.TryParse(String, Double);

Cela vous aidera à déterminer ce qui ne va pas dans chacune des chaînes avant de commencer l'analyse.
Si vous avez un problème lié à la culture, vous pouvez envisager d’utiliser:

Double.TryParse(String, NumberStyles, IFormatProvider, Double);

Ce http://msdn.Microsoft.com/en-us/library/system.double.tryparse.aspx est un très bon exemple d'utilisation.

Si vous avez besoin de longues informations, Int64.TryParse est également disponible: http://msdn.Microsoft.com/en-us/library/system.int64.tryparse.aspx

J'espère que cela pourra aider.

5
Ervi B

Ajouter une classe en tant que public et l'utiliser très facilement comme convertToInt32 ()

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Web;

  /// <summary>
  /// Summary description for Common
  /// </summary>
  public static class Common
  {
     public static double ConvertToDouble(string Value) {
        if (Value == null) {
           return 0;
        }
        else {
           double OutVal;
           double.TryParse(Value, out OutVal);

           if (double.IsNaN(OutVal) || double.IsInfinity(OutVal)) {
              return 0;
           }
           return OutVal;
        }
     }
  }

Puis appelez la fonction

double DirectExpense =  Common.ConvertToDouble(dr["DrAmount"].ToString());
3
Arun Prasad E S
private double ConvertToDouble(string s)
    {
        char systemSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator[0];
        double result = 0;
        try
        {
            if (s != null)
                if (!s.Contains(","))
                    result = double.Parse(s, CultureInfo.InvariantCulture);
                else
                    result = Convert.ToDouble(s.Replace(".", systemSeparator.ToString()).Replace(",", systemSeparator.ToString()));
        }
        catch (Exception e)
        {
            try
            {
                result = Convert.ToDouble(s);
            }
            catch
            {
                try
                {
                    result = Convert.ToDouble(s.Replace(",", ";").Replace(".", ",").Replace(";", "."));
                }
                catch {
                    throw new Exception("Wrong string-to-double format");
                }
            }
        }
        return result;
    }

et les tests réussis sont:

        Debug.Assert(ConvertToDouble("1.000.007") == 1000007.00);
        Debug.Assert(ConvertToDouble("1.000.007,00") == 1000007.00);
        Debug.Assert(ConvertToDouble("1.000,07") == 1000.07);
        Debug.Assert(ConvertToDouble("1,000,007") == 1000007.00);
        Debug.Assert(ConvertToDouble("1,000,000.07") == 1000000.07);
        Debug.Assert(ConvertToDouble("1,007") == 1.007);
        Debug.Assert(ConvertToDouble("1.07") == 1.07);
        Debug.Assert(ConvertToDouble("1.007") == 1007.00);
        Debug.Assert(ConvertToDouble("1.000.007E-08") == 0.07);
        Debug.Assert(ConvertToDouble("1,000,007E-08") == 0.07);
2
Sergey

Je vois dans votre chaîne: 15.5859949000000662452.23862099999999 qui n'est pas un double (il a deux points décimaux). Peut-être que c'est juste une erreur de saisie légitime?

Vous voudrez peut-être aussi savoir si votre dernière String sera vide et rendre compte de cette situation.

0
Rob I