Je pense qu'une conversion 100% correcte n'est pas possible, si la valeur provient d'une entrée utilisateur. Par exemple, si la valeur est 123.456, il peut s'agir d'un groupement ou d'un point décimal. Si vous avez vraiment besoin de 100%, vous devez décrire votre format et lever une exception s'il n'est pas correct.
Mais j'ai amélioré le code de JanW, ce qui nous permet d'avancer un peu plus vers les 100%. L'idée est que si le dernier séparateur est un groupSeperator, il s'agit plutôt d'un type entier que double.
Le code ajouté est dans le premier si de GetDouble .
void Main()
{
List<string> inputs = new List<string>() {
"1.234.567,89",
"1 234 567,89",
"1 234 567.89",
"1,234,567.89",
"1234567,89",
"1234567.89",
"123456789",
"123.456.789",
"123,456,789,"
};
foreach(string input in inputs) {
Console.WriteLine(GetDouble(input,0d));
}
}
public static double GetDouble(string value, double defaultValue) {
double result;
string output;
// check if last seperator==groupSeperator
string groupSep = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator;
if (value.LastIndexOf(groupSep) + 4 == value.Count())
{
bool tryParse = double.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture, out result);
result = tryParse ? result : defaultValue;
}
else
{
// unify string (no spaces, only . )
output = value.Trim().Replace(" ", string.Empty).Replace(",", ".");
// split it on points
string[] split = output.Split('.');
if (split.Count() > 1)
{
// take all parts except last
output = string.Join(string.Empty, split.Take(split.Count()-1).ToArray());
// combine token parts with last part
output = string.Format("{0}.{1}", output, split.Last());
}
// parse double invariant
result = double.Parse(output, System.Globalization.CultureInfo.InvariantCulture);
}
return result;
}