using System;
using System.Globalization;
using Developpez.Dotnet.Properties;
namespace Developpez.Dotnet
{
    /// 
    /// Fournit des méthodes pour travailler avec des nombres.
    /// 
    public static partial class Numbers
    {
        /// 
        /// Tente de convertir une chaine de caractères vers le type spécifié.
        /// 
        /// Type de destination
        /// Chaine à convertir
        /// Un nombre du type spécifié si la conversion réussit; sinon, null.
        public static T? TryParse(this string s) where T : struct
        {
            Delegate d;
            if (_parsers.TryGetValue(typeof(T), out d))
            {
                var f = (Func) d;
                return f(s);
            }
            throw new NotSupportedException(ExceptionMessages.OnlyNumericTypesAreSupported);
        }
        /// 
        /// Tente de convertir une chaine de caractères vers le type spécifié.
        /// 
        /// Type de destination
        /// Chaine à convertir
        /// Une combinaison de valeurs  indiquant le format autorisé de s.
        ///  qui fournit des informations de format propres à la culture concernant s.
        /// Un nombre du type spécifié si la conversion réussit; sinon, null.
        public static T? TryParse(this string s, NumberStyles style, IFormatProvider provider) where T : struct
        {
            Delegate d;
            if (_parsersWithStyleAndProvider.TryGetValue(typeof(T), out d))
            {
                var f = (Func)d;
                return f(s, style, provider);
            }
            throw new NotSupportedException(ExceptionMessages.OnlyNumericTypesAreSupported);
        }
    }
}