📄 conversion.vb
字号:
Return Oct(Convert.ToSByte(Number)) Case TypeCode.UInt16 Return Oct(Convert.ToUInt16(Number)) Case TypeCode.UInt32 Return Oct(Convert.ToUInt32(Number)) Case TypeCode.UInt64 Return Oct(Convert.ToUInt64(Number))#End If Case Else Throw New System.ArgumentException("Argument 'Number' cannot be converted to type '" + Number.GetType.FullName + "'.") End Select Else Throw New System.ArgumentException("Argument 'Number' is not a number.") End If End Function Public Function Oct(ByVal Number As Short) As String Return Convert.ToString(Number, 8).ToUpper End Function Public Function Str(ByVal Number As Object) As String If Number Is Nothing Then Throw New System.ArgumentNullException("Number", "Value cannot be null.") End If If TypeOf Number Is Byte Then If Convert.ToByte(Number) > 0 Then Return " " + Convert.ToString(Number, CultureInfo.InvariantCulture) Else Return Convert.ToString(Number, CultureInfo.InvariantCulture) End If ElseIf TypeOf Number Is Short Then If Convert.ToInt16(Number) > 0 Then Return " " + Convert.ToString(Number, CultureInfo.InvariantCulture) Else Return Convert.ToString(Number, CultureInfo.InvariantCulture) End If ElseIf TypeOf Number Is Integer Then If Convert.ToInt32(Number) > 0 Then Return " " + Convert.ToString(Number, CultureInfo.InvariantCulture) Else Return Convert.ToString(Number, CultureInfo.InvariantCulture) End If ElseIf TypeOf Number Is Long Then If Convert.ToInt64(Number) > 0 Then Return " " + Convert.ToString(Number, CultureInfo.InvariantCulture) Else Return Convert.ToString(Number, CultureInfo.InvariantCulture) End If ElseIf TypeOf Number Is Double Then If Convert.ToDouble(Number) > 0 Then Return " " + Convert.ToString(Number, CultureInfo.InvariantCulture) Else Return Convert.ToString(Number, CultureInfo.InvariantCulture) End If ElseIf TypeOf Number Is Decimal Then If Convert.ToDecimal(Number) > 0 Then Return " " + Convert.ToString(Number, CultureInfo.InvariantCulture) Else Return Convert.ToString(Number, CultureInfo.InvariantCulture) End If ElseIf TypeOf Number Is Single Then If Convert.ToSingle(Number) > 0 Then Return " " + Convert.ToString(Number, CultureInfo.InvariantCulture) Else Return Convert.ToString(Number, CultureInfo.InvariantCulture) End If ElseIf TypeOf Number Is String Then Throw New System.NullReferenceException("Object reference not set to an instance of an object.") Else Throw New System.InvalidCastException("Argument 'Number' cannot be converted to a numeric value.") End If End Function Public Function Val(ByVal Expression As Char) As Integer 'only '0' - '9' are acceptable If Strings.Asc(Expression) >= Strings.Asc("0"c) And Strings.Asc(Expression) <= Strings.Asc("9"c) Then Return Strings.Asc(Expression) - Strings.Asc("0"c) Else 'everything else is 0 Return 0 End If End Function Public Function Val(ByVal Expression As Object) As Double If Expression Is Nothing Then Return Val("") End If If TypeOf Expression Is Char Then Return Val(Convert.ToChar(Expression)) ElseIf TypeOf Expression Is String Then Return Val(Convert.ToString(Expression)) ElseIf TypeOf Expression Is Boolean Then Return Val(Convert.ToString((-1) * Convert.ToInt16(Expression))) 'FIXME: add more types. Return Val(StringType.FromObject(Expression)) Else Throw New System.ArgumentException("Argument 'Expression' cannot be converted to type '" + Expression.GetType.FullName + "'.") End If End Function Public Function Val(ByVal InputStr As String) As Double If InputStr Is Nothing Then InputStr = "" End If#If TRACE Then Console.WriteLine("TRACE:Conversion.Val:input:" + InputStr)#End If ' ' loop on InputStr chars Dim pos As Integer ' char iterator Dim CurrentChar As Char ' current char Dim CurrentCharAsc As Integer ' current ascii value of char Dim NumericString As String = "" Dim PeriodCollected As Boolean ' did we already collected a Period ? ' Is it a positive/negative decimal or Hex or Oct ' start as negative. the first one who turns into True, wins. Dim IsNegative As Boolean = False Dim IsDecimal As Boolean = False Dim IsHex As Boolean = False Dim IsOct As Boolean = False Dim IsE As Boolean ' ' Loop on string and decide what is the base of the number. ' trim all left whitespace ' For pos = 0 To InputStr.Length - 1 CurrentChar = Convert.ToChar(InputStr.Substring(pos, 1)) If System.Char.IsWhiteSpace(CurrentChar) Then 'do nothing. continue ElseIf System.Char.IsDigit(CurrentChar) Then 'its decimal. exit loop IsDecimal = True pos = InputStr.Length ElseIf CurrentChar = "-" Then IsNegative = True ElseIf CurrentChar = "&" Then 'if this is not the last char, 'take the next char and see if radix is H or O If pos < InputStr.Length - 1 Then CurrentChar = Convert.ToChar(InputStr.Substring(pos + 1, 1)) If CurrentChar = "H" Or CurrentChar = "h" Then 'its Hex. exit loop IsHex = True pos = InputStr.Length ElseIf CurrentChar = "O" Or CurrentChar = "o" Then 'its Oct. exit loop IsOct = True pos = InputStr.Length Else 'its bad. return 0. Return 0 End If End If Else 'the string didn't start with a digit or &H or &O 'its bad. return 0. Return 0 End If Next#If TRACE Then Console.WriteLine("TRACE:Conversion.Val:IsDecimal:" + IsDecimal.ToString() + "IsHex:" + IsHex.ToString() + "IsOct:" + IsOct.ToString())#End If For pos = 0 To InputStr.Length - 1 CurrentChar = Convert.ToChar(InputStr.Substring(pos, 1)) CurrentCharAsc = Strings.Asc(CurrentChar) 'collect numbers and one period, ignore whitespaces, stop on other If IsDecimal Then If System.Char.IsWhiteSpace(CurrentChar) Then 'ignore this char ElseIf CurrentChar = "-" Then IsNegative = True ElseIf System.Char.IsDigit(CurrentChar) Then 'collect this char NumericString = NumericString + CurrentChar ElseIf CurrentChar = "." Then 'The Val function recognizes only the period (.) as a valid decimal separator If Not PeriodCollected Then NumericString = NumericString + CurrentChar PeriodCollected = True Else 'period already collected. exit the loop. pos = InputStr.Length End If ElseIf IsE = False AndAlso (CurrentChar = "E"c OrElse CurrentChar = "e"c) Then IsE = True NumericString &= CurrentChar ElseIf IsE AndAlso CurrentChar = "+" Then 'ignore this Else 'exit the loop pos = InputStr.Length End If ElseIf IsHex Then If System.Char.IsWhiteSpace(CurrentChar) Or CurrentChar = "&" Or CurrentChar = "H" Or CurrentChar = "h" Then 'ignore this char ElseIf NumericString.Length = 16 Then 'max hex chars is 16. exit the loop. pos = InputStr.Length ElseIf System.Char.IsDigit(CurrentChar) Then 'collect this char NumericString = NumericString + CurrentChar ElseIf ((CurrentCharAsc >= Strings.Asc("A")) And (CurrentCharAsc <= Strings.Asc("F"))) Or _ ((CurrentCharAsc >= Strings.Asc("a")) And (CurrentCharAsc <= Strings.Asc("f"))) Then 'collect this char NumericString = NumericString + CurrentChar Else 'exit the loop. pos = InputStr.Length End If ElseIf IsOct Then If System.Char.IsWhiteSpace(CurrentChar) Or CurrentChar = "&" Or CurrentChar = "O" Or CurrentChar = "o" Then 'ignore this char ElseIf ((CurrentCharAsc >= Strings.Asc("0")) And (CurrentCharAsc <= Strings.Asc("7"))) Then 'collect this char NumericString = NumericString + CurrentChar Else 'exit the loop pos = InputStr.Length End If Else Throw New NotSupportedException("FIXME") End If Next pos#If TRACE Then Console.WriteLine("TRACE:Conversion.Val:collected string:" + NumericString)#End If 'convert the NumericString back to long 'FIXME:the Val return double but it seems to cast to long. add a test and check that. Dim retVal As Double = 0 If NumericString.Length > 0 Then If IsDecimal Then retVal = Convert.ToDouble(NumericString, New CultureInfo("en-US")) If IsNegative Then retVal = (-1) * retVal ElseIf IsHex Then NumericString = NumericString.ToUpper Dim NumericStringLength As Integer = NumericString.Length If (NumericStringLength = 4 Or NumericStringLength = 8 Or NumericStringLength >= 16) And NumericString.StartsWith("F") Then 'its negative If NumericStringLength = 4 Then retVal = Convert.ToDouble(Convert.ToInt64(NumericString, 16)) - Math.Pow(2, 16) If NumericStringLength = 8 Then retVal = Convert.ToDouble(Convert.ToInt64(NumericString, 16)) - Math.Pow(2, 32) If NumericStringLength >= 16 Then retVal = Convert.ToDouble(Convert.ToInt64(NumericString, 16)) Else retVal = Convert.ToDouble(Convert.ToInt64(NumericString, 16)) End If ElseIf IsOct Then retVal = Convert.ToInt64(NumericString, 8) Else 'FIXME: what else ? End If End If Return retVal 'exceptions 'FIXME:OverflowException - InputStr is too large. 'FIXME:InvalidCastException - Number is badly formed. 'FIXME:ArgumentException - Object type expression not convertible to String. End Function#If NET_2_0 Then <CLSCompliant(False)> _ Public Function Hex(ByVal Number As SByte) As String Return Convert.ToString(Number, 16).ToUpper End Function <CLSCompliant(False)> _ Public Function Hex(ByVal Number As UShort) As String Return Convert.ToString(Number, 16).ToUpper End Function <CLSCompliant(False)> _ Public Function Hex(ByVal Number As UInteger) As String Return Convert.ToString(Number, 16).ToUpper End Function <CLSCompliant(False)> _ Public Function Hex(ByVal Number As ULong) As String Return Convert.ToString(CLng(Number), 16).ToUpper End Function <CLSCompliant(False)> _ Public Function Oct(ByVal Number As SByte) As String Return Convert.ToString(Number, 8).ToUpper End Function <CLSCompliant(False)> _ Public Function Oct(ByVal Number As UShort) As String Return Convert.ToString(Number, 8).ToUpper End Function <CLSCompliant(False)> _ Public Function Oct(ByVal Number As UInteger) As String Return Convert.ToString(Number, 8).ToUpper End Function <CLSCompliant(False)> _ Public Function Oct(ByVal Number As ULong) As String Return Convert.ToString(CLng(Number), 8).ToUpper End Function#End If End ModuleEnd Namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -