2014-12-03 66 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