2016-03-28 127 views
0

我有需要進行循環計算的情況,其中任何一個NumericUpDown控件都會更改其值。所有這些控件都將屬性'DecimalPlaces'設置爲2.但是如果我想要在循環計算中獲得正確的結果,那麼我需要更多小數位。帶有小數的.NET NumericUpDown = AsNeeded

因此,現在我需要一個NumericUpDown控件(不太重要),以便可變化的小數位數表示'AsNeeded'。

例如,如果數字是1.2345,控件應該設置4位小數,如果是0.10,他們應該有1位小數來顯示數字。
當然我想這個屬性會自動轉換爲需要顯示的數字。

任何建議讓NumericUpDown控制工作的方式?

+0

你很想知道你打算如何閱讀用戶的想法,這是猜測他想輸入多少位數所需的功能。 NUD不是恰當的選擇,而是使用TextBox。 –

+0

您可以處理它的[ValueChanged事件](https://msdn.microsoft.com/en-us/library/system.windows.forms.numericupdown.valuechanged(v = vs.110).aspx?cs-save-lang = 1&CS琅= VB#代碼片斷-1)。 –

+0

漢斯,它不是關於用戶的選擇,而是關於數字有多少小數。如果用戶想在這裏輸入,那麼NUD不會再次限制它的任何小數位數。經過他的輸入我驗證它,然後在那裏我可以根據他的輸入設置DecimalPlaces。或者我認爲錯了? – user1697111

回答

2

只需設置由NumericUpDown控件顯示的小數位數的數量需要:

Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged 
    Dim ud = DirectCast(sender, NumericUpDown) 
    Dim val = Math.Abs(ud.Value) 
    Dim frac = (val - Math.Truncate(val)).ToString().TrimEnd({"0"c}) 
    ud.DecimalPlaces = Math.Max(frac.Length - If(val < 0, 3, 2), 0) 
End Sub 

我們只數的小數部分感興趣。我們不想要任何尾隨零。

轉換爲字符串時,分數將包含兩個前導字符(零和小數點分隔符),除非爲負數,此時有三個前導字符(減號,零和小數點分隔符) 。

如果您不喜歡通過一個字符串會得到小數位的數量,那麼你可以做這樣的:

Private Function Frac(d As Decimal) As Decimal 
    d = Math.Abs(d) 
    Return d - Math.Truncate(d) 
End Function 

Private Function NumberOfDecimals(x As Decimal) As Integer 
    x = Math.Abs(x) 
    Dim nPlaces = 0 

    While Frac(x) > 0 
     x = x * 10D 
     nPlaces += 1 
    End While 

    Return nPlaces 

End Function 

Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged 
    Dim ud = DirectCast(sender, NumericUpDown) 
    ud.DecimalPlaces = NumberOfDecimals(ud.Value) 
End Sub 

應爲值的範圍內工作,你都喜歡用NumericUpDown控件。我不想在Double或Single中使用該方法,因爲很多小數不是完全以浮點格式表示的。

請注意,技術上0.1與0.10不同 - 前者可以表示範圍[0.05,0.15)和後者[0.95,1.05)中的數字。

+0

Thanx Andrew。我雖然要避免字符串操作,但確定,這是好的開始... – user1697111

+0

@ user1697111因爲這是一個UI控制,我不會擔心使用字符串操作。 –

+0

@ user1697111我添加了一個避免字符串操作的方法。 –