只需設置由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)中的數字。
你很想知道你打算如何閱讀用戶的想法,這是猜測他想輸入多少位數所需的功能。 NUD不是恰當的選擇,而是使用TextBox。 –
您可以處理它的[ValueChanged事件](https://msdn.microsoft.com/en-us/library/system.windows.forms.numericupdown.valuechanged(v = vs.110).aspx?cs-save-lang = 1&CS琅= VB#代碼片斷-1)。 –
漢斯,它不是關於用戶的選擇,而是關於數字有多少小數。如果用戶想在這裏輸入,那麼NUD不會再次限制它的任何小數位數。經過他的輸入我驗證它,然後在那裏我可以根據他的輸入設置DecimalPlaces。或者我認爲錯了? – user1697111