Il n'existe pas de moyen intégré pour déterminer la CultureInfo à partir d'une chaîne numérique, autant que je sache. Et je doute sérieusement qu'il y en ait jamais un, car il n'existe pas de moyen sûr à 100% pour le faire.
Jusqu'à ce que vous trouviez une meilleure solution (par exemple : un changement du côté de l'expéditeur), je suppose que la meilleure chose à faire est de diminuer les chances d'erreur en deux étapes :
1) Nettoyage et normalisation des données d'entrée :
Dim input as String = " 99 9.000,00 "
' De cette façon, vous pouvez supprimer les caractères indésirables (tout ce qui n'est pas un chiffre, et les symboles suivants : ".", "-", ",")
Dim fixedInput as String = Regex.Replace(input, "[^\d-,\.]", "")
' fixedInput est maintenant "999.000,00"
2) Devinez vous-même le format :
Dim indexOfDot as Integer = fixedInput.IndexOf(".")
Dim indexOfComma as Integer = fixedInput.IndexOf(",")
Dim cultureTestOrder as List(Of CultureInfo) = new List(Of CultureInfo)
Dim parsingResult as Double?
Try
If indexOfDot > 0 And indexOfComma > 0 Then
' Il y a à la fois le point et la virgule..vérifions leur ordre
If indexOfDot > indexOfComma Then
' Le point vient après la virgule. Ce devrait être la Culture en-US
parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"))
Else
' Le point vient avant la virgule. Ce devrait être la Culture it-IT
parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("it-IT"))
End If
Else If indexOfDot = fixedInput.Length-3 Then
' Il y a seulement le point ! Et il est suivi de exactement deux chiffres..ce devrait être la Culture en-US
parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"))
Else If indexOfComma = fixedInput.Length-3 Then
' Il y a seulement la virgule ! Et elle est suivie de exactement deux chiffres..ce devrait être la Culture it-IT
parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("it-IT"))
End If
Catch
End Try
If Not parsingResult.HasValue Then
Try
' Il n'y a ni point ni virgule, ou l'analyse a échoué pour une raison quelconque. Essayons une analyse moins spécifique.
parsingResult = Double.Parse(fixedInput, NumberStyles.Any, NumberFormatInfo.InvariantInfo)
Catch
End Try
End If
If Not parsingResult.HasValue Then
' Conversion non possible, déclenchez une exception ou faites quelque chose d'autre
Else
' Utilisez parsingResult.Value
Vous n'êtes pas sûr à 100% de cette façon, mais cela devrait quand même être meilleur que votre code actuel (et fonctionne au moins comme prévu avec les données d'exemple que vous avez fournies).