Comment pourrais-je convertir des données de chaîne en long en c #


102

Comment puis-je convertir des données de chaîne en long en C #?

J'ai des données

String strValue[i] ="1100.25";

maintenant je le veux

long l1;

1
Les longs représentent des entiers. Vous avez donné un non-entier. Que voudriez-vous faire avec ça?
Jon Skeet

1
Et si strValue vaut "1100.75"? Voir: stackoverflow.com/questions/633335/…
magma

@magma: si vous le convertissez en décimal, il arrondira le nombre, c'est-à-dire que dans ce cas, si le nombre donné était 1100,75, il affichera 1101.
love Computer science

1
@charlie Je soulevais simplement la question, car MayP ne semblait pas être pleinement conscient de l'implication ici. Il voudra peut-être simplement se débarrasser de la partie non entière sans aucun arrondi, et c'est bien, à condition que ce soit vraiment ce qu'il veut. Merci quand même.
magma

Réponses:


187

Cette réponse ne fonctionne plus, et je ne peux rien trouver de mieux que les autres réponses (voir ci-dessous) énumérées ici. Veuillez les examiner et voter.

Convert.ToInt64("1100.25")

Signature de méthode de MSDN:

public static long ToInt64(
    string value
)

3
Voilà comment je l'ai fait. Doit être marqué comme la bonne réponse.
sanpaco

2
Cela donnera une chaîne qui n'est pas au format correct.
Badhon Jain

Cela ne marche pas. Erreur d'exception de format système. Un problème avec la chaîne de caractères dans un format incorrect.
Ricardo Araújo le

C'est correct ... cela ne semble plus fonctionner, comme cela a été le cas en 2013. Je publierai une mise à jour sous peu.
Will Bellman le

46

Si vous souhaitez obtenir la partie entière de ce nombre, vous devez d'abord le convertir en nombre flottant, puis le convertir en long.

long l1 = (long)Convert.ToDouble("1100.25");

Vous pouvez utiliser la Mathclasse pour arrondir le nombre comme vous le souhaitez, ou simplement tronquer ...


Cela vous donnera FormatExceptionsi vous exécutez ceci sur l'entrée spécifiée.
Andrew Savinykh

1
@zespri, non, du moins pas dans la plupart des cultures ... Mais cela échouerait en effet dans les cultures où le séparateur décimal n'est pas "."
Thomas Levesque

16

Vous pouvez également utiliser long.TryParseet long.Parse.

long l1;
l1 = long.Parse("1100.25");
//or
long.TryParse("1100.25", out l1);


6

Vous ne pourrez pas le convertir directement en long à cause du point décimal, je pense que vous devriez le convertir en décimal puis le convertir en long quelque chose comme ceci:

String strValue[i] = "1100.25";
long l1 = Convert.ToInt64(Convert.ToDecimal(strValue));

J'espère que cela t'aides!


3

long est représenté en interne comme System.Int64 qui est un entier signé 64 bits. La valeur que vous avez prise "1100.25" est en fait décimale et non entière, elle ne peut donc pas être convertie en long.

Vous pouvez utiliser:

String strValue = "1100.25";
decimal lValue = Convert.ToDecimal(strValue);

pour le convertir en valeur décimale



1

Vous pouvez également utiliser la Int64.TryParseméthode. Il renverra '0' s'il s'agit d'une valeur de chaîne mais n'a pas généré d'erreur.

Int64 l1;

Int64.TryParse(strValue, out l1);

1

Vous pouvez créer votre propre fonction de conversion:

    static long ToLong(string lNumber)
    {
        if (string.IsNullOrEmpty(lNumber))
            throw new Exception("Not a number!");
        char[] chars = lNumber.ToCharArray();
        long result = 0;
        bool isNegative = lNumber[0] == '-';
        if (isNegative && lNumber.Length == 1)
            throw new Exception("- Is not a number!");

        for (int i = (isNegative ? 1:0); i < lNumber.Length; i++)
        {
            if (!Char.IsDigit(chars[i]))
            {
                if (chars[i] == '.' && i < lNumber.Length - 1 && Char.IsDigit(chars[i+1]))
                {
                    var firstDigit = chars[i + 1] - 48;
                    return (isNegative ? -1L:1L) * (result + ((firstDigit < 5) ? 0L : 1L));    
                }
                throw new InvalidCastException($" {lNumber} is not a valid number!");
            }
            result = result * 10 + ((long)chars[i] - 48L);
        }
        return (isNegative ? -1L:1L) * result;
    }

Il peut encore être amélioré:

  • en termes de performances
  • rendre la validation plus stricte dans le sens où il ne se soucie pas actuellement de savoir si les caractères après la première décimale ne sont pas des chiffres
  • spécifiez le comportement d'arrondi comme paramètre de la fonction de conversion. il arrondit actuellement
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.