Насколько я знаю, нет встроенного способа определения CultureInfo из числовой строки.И я серьезно сомневаюсь, что это когда-либо случится, потому что не существует 100% безопасного способа сделать это.
Пока вы не найдете лучшего решения (например, некоторые изменения на стороне отправителя), я думаю, лучшееВы можете уменьшить вероятность ошибки в два этапа:
1) Очистка и стандартизация входных данных :
Dim input as String = " 99 9.000,00 "
' This way you can remove unwanted characters (anything that is not a digit, and the following symbols: ".", "-", ",")
Dim fixedInput as String = Regex.Replace(input, "[^\d-,\.]", "")
' fixedInput now is "999.000,00"
2) Угадайте себяформат :
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
' There are both the dot and the comma..let's check their order
If indexOfDot > indexOfComma Then
' The dot comes after the comma. It should be en-US like Culture
parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"))
Else
' The dot comes after the comma. It should be it-IT like Culture
parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("it-IT"))
End If
Else If indexOfDot = fixedInput.Length-3 Then
' There is only the dot! And it is followed by exactly two digits..it should be en-US like Culture
parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"))
Else If indexOfComma = fixedInput.Length-3 Then
' There is only the comma! And it is followed by exactly two digits..it should be en-US like Culture
parsingResult = Double.Parse(fixedInput, NumberStyles.Number, CultureInfo.GetCultureInfo("it-IT"))
End If
Catch
End Try
If Not parsingResult.HasValue Then
Try
' There is no dot or comma, or the parsing failed for some reason. Let's try a less specific parsing.
parsingResult = Double.Parse(fixedInput, NumberStyles.Any, NumberFormatInfo.InvariantInfo)
Catch
End Try
End If
If Not parsingResult.HasValue Then
' Conversion not possible, throw exception or do something else
Else
' Use parsingResult.Value
End If
Таким образом, вы не на 100% в безопасности, но он должен быть все же лучше, чем ваш текущий код (и, по крайней мере, работает так, как ожидается на примере данных, предоставленных вами).1015 *