web-dev-qa-db-fra.com

Convertit la chaîne en décimal, en gardant les fractions

J'essaie de convertir 1200.00 en decimal, mais Decimal.Parse() supprime .00. J'ai essayé différentes méthodes, mais cela supprime toujours .00, sauf lorsque je fournis une fraction différente de 0.

string value = "1200.00";

Méthode 1

 var convertDecimal = Decimal.Parse(value ,  NumberStyles.AllowThousands
       | NumberStyles.AllowDecimalPoint | NumberStyles.AllowCurrencySymbol);

Méthode 2

 var convertDecimal = Convert.ToDecimal(value);

Méthode 3

var convertDecimal = Decimal.Parse(value,
       NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture);

Comment convertir une string contenant 1200.00 en une decimal contenant 1200.00?

56
NETQuestion

Hmm ... Je ne peux pas reproduire ceci:

using System;

class Test
{
    static void Main()        
    {
        decimal d = decimal.Parse("1200.00");
        Console.WriteLine(d); // Prints 1200.00
    }
}

Êtes-vous sûr que ce n'est pas une autre partie de votre code normalisant la valeur décimale plus tard?

Juste au cas où il y aurait des problèmes culturels, essayez cette version qui ne devrait pas dépendre de vos paramètres régionaux:

using System;
using System.Globalization;

class Test
{
    static void Main()        
    {
        decimal d = decimal.Parse("1200.00", CultureInfo.InvariantCulture);
        Console.WriteLine(d.ToString(CultureInfo.InvariantCulture));
    }
}
73
Jon Skeet

Je pense que votre problème est lors de l'affichage du nombre décimal, pas le contenu de celui-ci.

Si tu essayes

string value = "1200.00";
decimal d = decimal.Parse(s);
string s = d.ToString();

s contiendra la chaîne "1200".

Cependant, si vous changez votre code pour cela

string value = "1200.00";
decimal d = decimal.Parse(s);
string s = d.ToString("0.00");

s contiendra la chaîne "1200.00" comme vous le souhaitez.

MODIFIER

On dirait que je suis braindead tôt le matin aujourd'hui. J'ai ajouté les déclarations Parse maintenant. Cependant, même mon premier code produira "1200.00", même si je m'attendais à ce qu'il produise "1200". On dirait que j'apprends quelque chose chaque jour et, dans ce cas, évidemment, c'est quelque chose d'assez fondamental.

Donc, ne tenez pas compte de cette réponse. Nous aurons probablement besoin de plus de code pour identifier votre problème dans ce cas.

11
Øyvind Bråthen

Le code ci-dessous affiche la valeur sous la forme 1200.00. 

var convertDecimal = Convert.ToDecimal("1200.00");
Console.WriteLine(convertDecimal);

Vous ne savez pas ce que vous attendez?

5
Ramesh

Voici une solution que je suis venu pour moi-même. Ceci est prêt à être exécuté en tant que projet d'invite de commande. Vous devez nettoyer certaines choses sinon. J'espère que cela t'aides. Il accepte plusieurs formats d’entrée tels que: 1.234.567,89, 1.234.567.89, etc.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Globalization;
    using System.Linq;

    namespace ConvertStringDecimal
    {
        class Program
        {
            static void Main(string[] args)
            {
                while(true)
                {
                    // reads input number from keyboard
                    string input = Console.ReadLine();
                    double result = 0;
                    // remove empty spaces
                    input = input.Replace(" ", "");
                    // checks if the string is empty
                    if (string.IsNullOrEmpty(input) == false)
                    {
                        // check if input has , and . for thousands separator and decimal place
                        if (input.Contains(",") && input.Contains("."))
                        {
                            // find the decimal separator, might be , or .
                            int decimalpos = input.LastIndexOf(',') > input.LastIndexOf('.') ? input.LastIndexOf(',') : input.LastIndexOf('.');
                            // uses | as a temporary decimal separator
                            input = input.Substring(0, decimalpos) + "|" + input.Substring(decimalpos + 1);
                            // formats the output removing the , and . and replacing the temporary | with .
                            input = input.Replace(".", "").Replace(",", "").Replace("|", ".");
                        }
                        // replaces , with .
                        if (input.Contains(","))
                        {
                            input = input.Replace(',', '.');
                        }
                        // checks if the input number has thousands separator and no decimal places
                        if(input.Count(item => item == '.') > 1)
                        {
                            input = input.Replace(".", "");
                        }
                        // tries to convert input to double
                        if (double.TryParse(input, out result) == true)
                        {
                            result = Double.Parse(input, NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.InvariantCulture);
                        }
                    }
                    // outputs the result
                    Console.WriteLine(result.ToString());
                    Console.WriteLine("----------------");
                }
            }
        }
    }
2
Paulo Verissimo

Utilisez cet exemple

System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("en-GB",true);

decimal currency_usd = decimal.Parse(GetRateFromCbrf("usd"),culInfo);
decimal currency_eur = decimal.Parse(GetRateFromCbrf("eur"), culInfo);
2

le nombre décimal d = 3,00 correspond toujours à 3 . Je suppose que vous souhaitez l'afficher à l'écran ou l'imprimer sur le fichier journal sous la forme 3,00 ..__

string str = d.ToString("F2");

ou si vous utilisez la base de données pour stocker la décimale, vous pouvez définir la valeur pricision dans la base de données.

0
A.Learn

La valeur est la même, même si la représentation imprimée n’est pas celle que vous attendez:

decimal d = (decimal )1200.00;
Console.WriteLine(Decimal.Parse("1200") == d); //True
0
KingCode

L'utilisation de la classe CultureInfo a fonctionné pour moi, j'espère vous aider.

    string value = "1200.00";
    CultureInfo culture = new CultureInfo("en-US");
    decimal result = Convert.ToDecimal(value, culture);
0
Juan Carlos

Vous pouvez essayer d'appeler cette méthode dans votre programme:

static double string_double(string s)
    {
        double temp = 0;
        double dtemp = 0;
        int b = 0;
        for (int i = 0; i < s.Length; i++)
        {
            if (s[i] == '.')
            {
                i++;
                while (i < s.Length)
                {
                    dtemp = (dtemp * 10) + (int)char.GetNumericValue(s[i]);
                    i++;
                    b++;
                }
                temp = temp + (dtemp * Math.Pow(10, -b));
                return temp;
            }
            else
            {
                temp = (temp * 10) + (int)char.GetNumericValue(s[i]);
            }
        }
        return -1; //if somehow failed
    }

Exemple:

string s = "12.3";
double d = string_double (s);        //d = 12.3 
0
user7507137