我有以下Sub
Sub InsertValueToTextbox(of t)(byval valueToInsert as t)
Dim text as String
text = valueToInsert.tostring
'Now I put the text into a textbox...
End Sub
我的问题是,如果我得到的值有小数位,我想绕它。所以我试过了:
text = Math.Round(CType(valueToInsert, Decimal), 1).ToString
但编译器给出了错误,即t不能转换为十进制。 CDec
和Convert
在这里也没有帮助。谁能告诉我如何将匿名类型转换为像decimal这样的原始数据类型?
答案 0 :(得分:1)
您可以为所有数字类型和字符串实现的泛型参数添加IConvertivble
约束:
Public Shared Function GetStringValueOf(Of t As {IComparable, IConvertible})(ByVal valueToInsert As t) As String
Dim decimalValue As Decimal
Try
decimalValue = valueToInsert.ToDecimal(Globalization.NumberFormatInfo.CurrentInfo)
Return Math.Round(decimalValue, 1).ToString()
Catch ex As System.FormatException
' silently ignore this '
End Try
Return valueToInsert.ToString(Globalization.NumberFormatInfo.CurrentInfo)
End Function
然后这个有效:
Dim result1 As String = GetStringValueOf("Test") ' Test '
Dim result2 As String = GetStringValueOf("100,678") ' 100,7 -> comma is my decimal separator'
Dim result3 As String = GetStringValueOf(100.678) ' 100,7 '
结果:100,7
顺便说一句,将文本插入TextBox
并不是那种方法的工作。
答案 1 :(得分:1)
与Tim的方法类似,但没有抛出异常,您可以检查传入的实际类型,并且只对您感兴趣的数字类型进行舍入:
Function InsertValueToTextbox(Of t As IConvertible)(ByVal valueToInsert As t) As String
Dim text As String
Dim formatter As IFormatProvider = CultureInfo.CurrentCulture
Select Case GetType(t)
Case GetType(System.Decimal)
text = Math.Round(valueToInsert.ToDecimal(formatter), 1).ToString
Case Else
text = valueToInsert.ToString(formatter)
End Select
Return text
End Function
注意我将其更改为一个函数,因此它返回字符串值,使其更具可重用性