-
Jul 12th, 2017, 03:40 PM
#1
Convert String to Double
This Function is really a hybrid between the Microsoft.VisualBasic.Val() method and the Double.TryParse() method. The way that it works is by trying to match a valid Double at the beginning of a String and returns a Boolean value based on if the conversion is successful. The conversion will stop and return a False value if at minimum the beginning of the String cannot be converted to an Integer. The conversion will stop and return a True value if the beginning of the String can be converted to an Integer, a Double, or Integer/Double with the exponent symbol.
When comparing this Function to the Val() method, there are some pros and con's:
Pros
- Returns a Boolean value on if the conversion is successful (as opposed to returning 0).
- Uses the current culture to validate unary operators and mantissa (as opposed to using -, +, and .).
- A pure .NET alternative (as opposed to referencing the Microsoft.VisualBasic namespace).
Cons
- Does not recognize the radix prefixes &O (for octal) and &H (for hexadecimal).
- Does not recognize thousands separators (1,234 does not equal one thousand two hundred thirty four). -Thanks Shaggy!
Code:
Code:
''' <summary>
''' Returns the numbers contained at the beginning of a String.
''' </summary>
''' <param name="source">A string containing a number at the beginning to convert.</param>
''' <param name="conversion">The value will be equal to the double-precision floating-point number equivalent of the source parameter.</param>
''' <returns>Double</returns>
''' <remarks>
''' If the value returned is False, then the value of conversion will be equal to the default value of a Double
''' Uses the current culture information to match unary operators and mantissa.
''' </remarks>
Private Function TryParse_Beginning(ByVal source As String, ByRef conversion As Double) As Boolean
If String.IsNullOrWhitespace(source) Then Throw New ArgumentException("The source parameter cannot be a blank String.")
'Get the current culture information
Dim culture As Globalization.CultureInfo = Globalization.CultureInfo.CurrentCulture
'Declare a placeholder index
Dim index As Integer = 0
'Check for the optional unary operator
If source(index).ToString() = culture.NumberFormat.NegativeSign OrElse source(index).ToString() = culture.NumberFormat.PositiveSign Then
index += 1
End If
'Match one or more digits
If index < source.Length AndAlso Char.IsDigit(source(index)) Then
Do While index < source.Length AndAlso Char.IsDigit(source(index))
index += 1
Loop
Else
Return False
End If
'Optionally match a mantissa followed by one or more digits
If index + 1 < source.Length AndAlso source(index).ToString() = culture.NumberFormat.NumberDecimalSeparator AndAlso Char.IsDigit(source(index + 1)) Then
index += 1
Do While index < source.Length AndAlso Char.IsDigit(source(index))
index += 1
Loop
End If
'Optionally match an exponent, followed by an optional unary operator, followed by 1 or more digits
If index + 1 < source.Length AndAlso (source(index) = "e"c OrElse source(index) = "E"c) Then
If index + 2 < source.Length AndAlso (source(index + 1).ToString = culture.NumberFormat.NegativeSign OrElse source(index + 1).ToString = culture.NumberFormat.PositiveSign) AndAlso Char.IsDigit(source(index + 2)) Then
index += 2
Do While index < source.Length AndAlso Char.IsDigit(source(index))
index += 1
Loop
ElseIf index + 1 < source.Length AndAlso Char.IsDigit(source(index + 1)) Then
index += 1
Do While index < source.Length AndAlso Char.IsDigit(source(index))
index += 1
Loop
End If
End If
'Convert everything up to the index
conversion = Convert.ToDouble(source.Substring(0, index))
Return True
End Function
Demonstration
Fiddle: https://dotnetfiddle.net/cdnW5f
Last edited by dday9; Jul 17th, 2017 at 02:11 PM.
Reason: Added ArgumentException
-
Jul 14th, 2017, 05:27 PM
#2
Re: Convert String to Double
How does it do with commas? The objection I've always had to Val() was this:
Val("1,234") = 1
If people are entering numbers in a textbox, you can't stop them from adding that comma.
My usual boring signature: Nothing
-
Jul 14th, 2017, 09:41 PM
#3
Re: Convert String to Double
This does not account for thousands separators, though in this case of the current culture dictates that a comma acts as the mantissa, then the number would read: one point two three four.
-
Jul 28th, 2017, 10:19 AM
#4
Re: Convert String to Double
Thousands separators are a major pain in the butt to deal with, I don't have enough global knowledge or patience to deal with them. The last time I messed with trying to parse them myself the data structures seemed to indicate not all cultures group by thousands, some might use different separators in different places, each "group" might be different sizes...
It was bewildering to test and I gave up. Probably the best thing to do re: thousands separators is to define a list of cultures you support (and have samples to test against) and hope the list doesn't grow.
This answer is wrong. You should be using TableAdapter and Dictionaries instead.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|