在需要循环计算的情况下,3个NumericUpDown控件中的任何一个都会更改其值。所有这些控件都将属性'DecimalPlaces‘设置为2,但是如果我想在循环计算中得到适当的结果,需要更多的小数位数。
所以现在我需要一个NumericUpDown控件(不太重要)来改变小数,比如'AsNeeded‘。
例如,如果数字是1.2345,控件应该设置了4个小数,如果是0.10,则应该有一个小数位来显示一个数字。
当然,我希望这个财产自动变化,考虑到需要显示的数字。
有什么建议可以让NumericUpDown控件这样工作吗?
发布于 2016-03-28 11:45:15
只需根据需要设置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控件的值范围。我不想用双或单的方法,因为很多小数都不是用浮点格式表示的。
注意,从技术上讲,0.1不等于0.10 -前者可以代表一个范围内的数字[0.05,0.15),而后者则代表[0.95,1.05]。
https://stackoverflow.com/questions/36260065
复制相似问题