我有一些双重值的自定义字符串格式。我需要在某些时候将这些字符串转换为double值(请注意,这些字符串可能包含除数字之外的错误消息)。所以我首先检查这些字符串是否为数字,如果是,则将它们转换为double。 Isnumeric适用于我的第一个自定义字符串格式。但我发现数字无法识别百分比字符串。我想知道为什么isnumeric理解()但不能理解%。什么是将“(100.00)”和“50%”转换为Cdbl以外的双打的更好方法?
Private Format As String = "###,###,###,##0.00;(###,###,###,##0.00);0" 'negative values are in the format (number)
Private rateFormat as string="p"
Dim str1 as string=-100.0.Tostring(Format) 'str1=(100.0)
Dim str2 as string=0.5.Tostring(rateFormat) 'str2=50%
Dim value1,value2 as double
If isnumeric(str1)
value1=Cdbl(str1) 'True. value1=-100.0
else
value1=Double.MinValue
End If
If isnumeric(str2)
value2=cdbl(str2) 'False.value2=Double.Minvalue
else
value2=Double.MinValue
End If
答案 0 :(得分:0)
isnumeric返回一个布尔值,指示表达式是否可以作为数字计算。在你的情况下,%不是数字,所以错误。请尝试以下代码。
If isnumeric(str2.Substring(0,str2.length-2))
如果Expression的数据类型为Boolean,Byte,Decimal,Double,Integer,Long,SByte,Short,Single,UInteger,ULong或UShort,或者包含其中一种数字类型的Object,则IsNumeric返回True。如果Expression是可以成功转换为数字的Char或String,它也会返回True。
如果Expression的数据类型为Date或数据类型为Object且不包含数字类型,则IsNumeric返回False。如果Expression是无法转换为数字的Char或String,则IsNumeric返回False。
答案 1 :(得分:0)
() 是一种数字格式。它用于记账以表示负值,而不是“ - ”。
答案 2 :(得分:0)
首先,IsNumeric
和C<whatever>
通常不会被使用,因为它们可以提供意外的输出。通常,您会使用Double.TryParse
或Convert.ToDouble
(或任何类型),因为它们可以像您期望的那样可靠地解析数字;你必须确保它的格式正确。
此外,这些方法更有效,因为您可以确定字符串是否为数字并一次性解析它。请注意,Parse
和Convert
会在格式错误时抛出异常。
现在,据我所知,已经知道从百分比表示法转换的内置方式。我继续写了三种方法(当前文化,任何文化,不变文化),在百分号的四个可能位置上用0.5和-0.5进行了很好的测试。
'these will return Double.NaN if they fails
'this parses based on the current culture
Public Function ParseDoublePercent(ByVal input As String) As Double
Return ParseDoublePercent(input, System.Globalization.NumberFormatInfo.CurrentInfo)
End Function
'invariant culture
Public Function ParseDoublePercentInvariant(ByVal input As String) As Double
Return ParseDoublePercent(input, System.Globalization.NumberFormatInfo.InvariantInfo)
End Function
'this parses based on a specified culture
Public Function ParseDoublePercent(ByVal input As String, ByVal provider As IFormatProvider) As Double
If String.IsNullOrEmpty(input) OrElse input.Length < 3 Then Return Double.NaN 'minimum length of string is 2 (0%)
'get some information about how the percent should be formatted
Dim format As System.Globalization.NumberFormatInfo = System.Globalization.NumberFormatInfo.GetInstance(provider)
'how this will be parsed will first depend on if it's positive or negative
Dim isNegative As Boolean = input.Substring(0, 1) = "-"
Dim percentPattern As Integer = If(isNegative, format.PercentNegativePattern, format.PercentPositivePattern)
'i'm using convert.todouble because I don't want to use NumberStyles in Double.TryParse
Try
Select Case percentPattern
Case 0 'n %, such as -50.00 %, 50.00 %
Return Convert.ToDouble(
input.Replace(" " & format.PercentSymbol, "e-" & format.PercentDecimalDigits),
provider)
Case 1 'n%, such as -50.00%, 50.00%
Return Convert.ToDouble(
input.Replace(format.PercentSymbol, "e-" & format.PercentDecimalDigits),
provider)
Case 2 '%n, such as -%50.00, %50.00
'need to do some special parsing just in case there are incorrect percent signs in the middle of the number
'dont want to just replace all of them
Return Convert.ToDouble(
input.Remove(If(isNegative, 1, 0), 1) & "e-" & format.PercentDecimalDigits, provider)
Case 3 '% n, such as '%-50.00, % 50.00
Return Convert.ToDouble(input.Remove(0, 1) & "e-" & format.PercentDecimalDigits, provider)
Case Else
Return Double.NaN 'should not happen
End Select
Catch ex As FormatException 'an exception is thrown when the string fails to parse
Return Double.NaN
End Try
End Function
答案 3 :(得分:0)
实际上是一种数字格式。在你的情况下,%不是数字,所以错误。