2014-12-03 97 views
2

我有以下子转换泛型参数到原始数据类型

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不能转换为十进制。 CDecConvert也不帮助。任何人都可以告诉我如何将匿名类型转换为像十进制这样的基本数据类型?

+0

谢谢我更改了主题 – ruedi 2014-12-03 09:14:50

+2

此参数用于什么?它总是一个数字类型还是可以是任何类型?你可以尝试将它转换为十进制,双等等,如果演员成功了,你可以将其舍入。 – 2014-12-03 09:15:59

+0

我从Excel单元格中读取数据并将它们放入Powerpoint文本框中。因此,每个可以在excel单元中的类型都可以是t的类型。 它可以是字符串,ULong,Decimal,Single,Date。 – ruedi 2014-12-03 09:26:13

回答

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不是该方法的工作。

+0

它的工作原理。 Try catch块中的代码将返回四舍五入的值。现在我将开始理解它!最后,你的评论意味着我应该为这份工作编写一个单独的方法? – ruedi 2014-12-03 09:44:28

+1

@ruedi:分配“TextBox.Text”的任务是微不足道的。你应该在需要的地方去做。但考虑到这种转换方法在没有文本框或不想将结果分配给一个文本框的上下文中可能也很有用。如果你想重用你的类/方法,你不应该硬链接任何不相关的任务。 – 2014-12-03 09:46:43

+0

好吧,我明白了。非常感谢您的帮助和教学! – ruedi 2014-12-03 09:49:02

1

蒂姆方法,但没有抛出异常类似,您可以检查实际的类型传入和圆形只有数字类型,您感兴趣的是:

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 

注意我改变这是一个功能,所以它返回字符串值,使其更可重复使用

+0

我在我的环境中测试了这一点,它也能正常工作!谢谢! – ruedi 2014-12-03 09:56:58