"123.4"en double avec
double.Parse()ou
Convert.ToDouble()plante.
this, ce modificateur indique qu'il s'agit d'une extension de la classe du type de ce paramètre.
<System.Runtime.CompilerServices.Extension>avant la déclaration.
using System.Globalization; using System.Text.RegularExpressions; namespace ConversionStringDouble { static class Extensions { /// <summary> /// Tente de convertir une string en double sans se poser de question /// </summary> /// <param name="Texte"></param> /// <returns>Le double si c'est possible, Not A Number dans le cas contraire</returns> public static double ToDoubleBasique(this string Texte) { double nombre; if (double.TryParse(Texte, out nombre)) return nombre; else return double.NaN; } } }
Imports System.Globalization Imports System.Text.RegularExpressions Friend Module Extensions ''' <summary> ''' Tente de convertir une string en double sans se poser de question ''' </summary> ''' <param name="Texte"></param> ''' <returns>Le double si c'est possible, Not A Number dans le cas contraire</returns> <System.Runtime.CompilerServices.Extension> Public Function ToDoubleBasique(ByVal Texte As String) As Double Dim nombre As Double If Double.TryParse(Texte, nombre) Then Return nombre Else Return Double.NaN End If End Function End Module
'lesNombres est une liste de double lesNombres.Add("123.4".ToDoubleBasique()) 'ajoute 123.4 si le symbole décimal du PC est le point et NaN dans le cas contraire lesNombres.Add("123,4".ToDoubleBasique()) 'ajoute 123.4 si le symbole décimal du PC est la virgule et NaN dans le cas contraire lesNombres.Add("1 234".ToDoubleBasique()) 'ajoute 1234.0 si la culture est française et NaN dans le cas contraire lesNombres.Add("1 234,1".ToDoubleBasique()) 'ajoute 1234.1 si la culture est française et NaN dans le cas contraire lesNombres.Add("1,234.1".ToDoubleBasique()) 'ajoute 1234.1 si la culture est américaine et NaN dans le cas contraire
/// <summary> /// Tente de convertir un texte au format #######.#### ou #######,##### en remplaçant la virgule par le point et en forçant la culture par défaut (Invariant Culture) /// </summary> /// <param name="Texte"></param> /// <returns>Le double si c'est possible, Not A Number dans le cas contraire</returns> public static double ToDoubleGereSymboleDecimal(this string Texte) { double nombre; if (double.TryParse(Texte.Replace(',','.'),NumberStyles.Number, CultureInfo.InvariantCulture, out nombre)) return nombre; else return double.NaN; }
''' <summary> ''' Tente de convertir un texte au format #######.#### ou #######,##### en remplaçant la virgule par le point et en forçant la culture par défaut (Invariant Culture) ''' </summary> ''' <param name="Texte"></param> ''' <returns>Le double si c'est possible, Not A Number dans le cas contraire</returns> <System.Runtime.CompilerServices.Extension> Public Function ToDoubleGereSymboleDecimal(ByVal Texte As String) As Double Dim nombre As Double If Double.TryParse(Texte.Replace(","c, "."c), NumberStyles.Number, CultureInfo.InvariantCulture, nombre) Then Return nombre Else Return Double.NaN End If End Function
lesNombres.Add("123.4".ToDoubleGereSymboleDecimal()) 'ajoute 123.4 quelque soit le symbole décimal du PC lesNombres.Add("123,4".ToDoubleGereSymboleDecimal()) 'idem lesNombres.Add("1 234".ToDoubleGereSymboleDecimal()) 'ajoute NaN quelque soit le symbole décimal du PC lesNombres.Add("1 234.1".ToDoubleGereSymboleDecimal()) 'idem lesNombres.Add("1 234,1".ToDoubleGereSymboleDecimal()) 'idem lesNombres.Add("1,234.1".ToDoubleGereSymboleDecimal()) 'idem
/// <summary> /// Tente de déterminer si le texte représente un nombre et de le convertir en double le cas échéant /// </summary> /// <param name="Texte"></param> /// <returns>Le double si c'est possible, Not A Number dans le cas contraire</returns> public static double ToDouble(this string Texte) { CultureInfo culture = CultureInfo.InvariantCulture; if (Regex.IsMatch(Texte, @"^\d{1,3}( ?\d{3})*([\.,](\d{3} ?)*\d{1,3})?$"))//teste avec une regex qui cherche un nombre représenté avec ou sans espace comme séparateur des milliers et soit le point soit la virgule comme séparateur décimal Texte = Texte.Replace(',', '.').Replace(" ", "");//on enlève les espaces éventuels et on force le . en symbole décimal else if (Regex.IsMatch(Texte, @"^\d{1,3}(,?\d{3})*(\.(\d{3},?)*\d{1,3})?$"))//teste avec une regex qui cherche un nombre représenté avec ou sans virgule comme séparateur des milliers et le point comme séparateur décimal Texte = Texte.Replace(",", "");//on enlève les espaces virgules //si on connait une autre culture il faut faire un autre esle if avec une regex adaptée double nombre; if (double.TryParse(Texte, NumberStyles.Number, CultureInfo.InvariantCulture, out nombre)) return nombre; else return double.NaN; }
''' <summary> ''' Tente de déterminer si le texte représente un nombre et de le convertir en double le cas échéant ''' </summary> ''' <param name="Texte"></param> ''' <returns>Le double si c'est possible, Not A Number dans le cas contraire</returns> <System.Runtime.CompilerServices.Extension> Public Function ToDouble(ByVal Texte As String) As Double Dim culture As CultureInfo = CultureInfo.InvariantCulture If Regex.IsMatch(Texte, "^\d{1,3}( ?\d{3})*([\.,](\d{3} ?)*\d{1,3})?$") Then 'teste avec une regex qui cherche un nombre représenté avec ou sans espace comme séparateur des milliers et soit le point soit la virgule comme séparateur décimal Texte = Texte.Replace(","c, "."c).Replace(" ", "") 'on enlève les espaces éventuels et on force le. en symbole décimal ElseIf Regex.IsMatch(Texte, "^\d{1,3}(,?\d{3})*(\.(\d{3},?)*\d{1,3})?$") Then 'teste avec une regex qui cherche un nombre représenté avec ou sans virgule comme séparateur des milliers et le point comme séparateur décimal Texte = Texte.Replace(",", "") 'on enlève les espaces virgules End If 'si on connait une autre culture il faut faire un autre else if avec une regex adaptée Dim nombre As Double If Double.TryParse(Texte, NumberStyles.Number, CultureInfo.InvariantCulture, nombre) Then Return nombre Else Return Double.NaN End If End Function
lesNombres.Add("123.4".ToDouble()) 'ajoute 123.4 quelque soit le symbole décimal du PC lesNombres.Add("123,4".ToDouble()) 'idem lesNombres.Add("1 234".ToDouble()) 'ajoute 1234.0 quelque soit la culture du PC lesNombres.Add("1 234.1".ToDouble()) 'ajoute 1234.1 quelque soit la culture du PC lesNombres.Add("1 234,1".ToDouble()) 'idem lesNombres.Add("1 234.1".ToDouble()) 'idem lesNombres.Add("1,234.1".ToDouble()) 'idem lesNombres.Add("1,234,456".ToDouble()) 'ajoute 123456.0 quelque soit la culture du PC
lesNombres.Add("1,234".ToDouble()) 'ajoute 1.234 quelque soit la culture du PC, car le texte est intercepté par la première Regex.
double.TryParse(Texte.Replace(',','.'),NumberStyles.AllowCurrencySymbol, CultureInfo.InvariantCulture, out nombre)
Avis de décès, Carte de voeux, Bricolage, Coloriages, Cinéma, Coiffure, Cuisine, Déco, Dictionnaire, Horoscope, Jeux en ligne, Programme TV, Recettes, Restaurant, SMIC, Test débit, Voyage, Signification prénom