【问题标题】:Convert generic parameter to primitive datatype将泛型参数转换为原始数据类型
【发布时间】:2014-12-03 09:09:55
【问题描述】:

我有以下子

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 在这里也没有帮助。谁能告诉我如何将匿名类型转换为像十进制这样的原始数据类型?

【问题讨论】:

  • 谢谢我换了话题
  • 这个参数是干什么用的?它总是数字类型还是可以是任何类型?您可以尝试将其转换为十进制、双精度等,如果转换成功,您可以对其进行四舍五入。
  • 我从 excel 单元格中读取数据并将它们放入 powerpoint 文本框中。因此,可以在 excel 单元格中的每种类型都可以是 t 的类型。可以是字符串、ULong、Decimal、Single、Date。

标签: .net vb.net generics type-conversion anonymous-types


【解决方案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 '

结果:1​​00,7

顺便说一句,将文本插入TextBox 不是该方法的工作。

【讨论】:

  • 它有效。 Try catch 块中的代码返回舍入值。现在我将开始了解它!最后你的评论是说我应该为这项工作编写一个单独的方法?
  • @ruedi:分配TextBox.Text 的任务很简单。你应该在你需要的地方做。但是考虑到这种转换方法在您没有文本框或不想将结果分配给文本框的上下文中也可能很有用。如果你想重用你的类/方法,你不应该硬链接不相关的任务。
  • 好的,我明白了。非常感谢您的帮助和教导!
【解决方案2】:

类似于 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

注意我把它改成了一个函数,所以它返回字符串值,使其更易于重用

【讨论】:

  • 我在我的环境中测试了它,它也可以正常工作!谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
相关资源
最近更新 更多