Langage C# – Convertir des chaînes de caractères en nombres décimaux

La conversion de données numériques sous forme de chaîne de caractères en nombre décimaux peut être problématique en fonction des données fournies à l’application, des paramètres régionaux du système d’exploitation sur lequel l’application s’exécute et la configuration de la culture du thread exécutant le code, …
Dans cet article, je vous propose une méthode de conversion sous la forme d’une méthode d’extension, étendant le type string. J’ai implémenté cette classe dans l’espace de nom System, afin que cette méthode soit utilisable dans tout bloc de code C# (car cet espace de nom est importé par défaut dans les classes) :

namespace System
{
    public static class StringExtension
    {
        public static decimal ToDecimal(this string aValeur)
        {
            // Variables locales.
            bool bResult;
            decimal dValue;
            CultureInfo oCulture;

            // Initialisation.
            oCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            oCulture.NumberFormat.NumberDecimalSeparator = ",";

            // Première tentative de conversion.
            bResult = decimal.TryParse(aValeur, System.Globalization.NumberStyles.Number, oCulture, out dValue);

            if (!bResult)
            {
                // Seconde tentative de conversion avec le point comme séparateur de décimales.
                bResult = decimal.TryParse(aValeur, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out dValue);
            }

            // Retour.
            return dValue;
        }
    }
}

Voici un bloc de code permettant de tester cette méthode :

static void Main(string[] args)
{
    // Variables locales.
    string sValeur;
    decimal dValeur;

    try
    {
        // Valeur décimale avec une virgule comme séparateur de décimales.
        sValeur = "123,45";
        dValeur = sValeur.ToDecimal();
        Console.WriteLine($"{sValeur} -> {dValeur}");

        // Valeur décimale avec un point comme séparateur de décimales.
        sValeur = "123.45";
        dValeur = sValeur.ToDecimal();
        Console.WriteLine($"{sValeur} -> {dValeur}");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    finally
    {
        Console.ReadKey();
    }
}

Résultat :
Si la virgule est définie comme caractère séparateur dans les paramètres régionaux du système d’exploitation :
123,45 -> 123,45
123.45 -> 123,45

Si la virgule est définie comme caractère séparateur dans les paramètres régionaux du système d’exploitation :
123,45 -> 123.45
123.45 -> 123.45

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j’alterne les missions de formation et d’ingénierie avec cette plateforme. J’écris ce blog pour transmettre mes connaissances à tout développeur, qu’il soit débutant ou expérimenté.