首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET NumericUpDown和Decimals=AsNeeded

.NET NumericUpDown和Decimals=AsNeeded
EN

Stack Overflow用户
提问于 2016-03-28 10:05:42
回答 1查看 459关注 0票数 0

在需要循环计算的情况下,3个NumericUpDown控件中的任何一个都会更改其值。所有这些控件都将属性'DecimalPlaces‘设置为2,但是如果我想在循环计算中得到适当的结果,需要更多的小数位数。

所以现在我需要一个NumericUpDown控件(不太重要)来改变小数,比如'AsNeeded‘。

例如,如果数字是1.2345,控件应该设置了4个小数,如果是0.10,则应该有一个小数位来显示一个数字。

当然,我希望这个财产自动变化,考虑到需要显示的数字。

有什么建议可以让NumericUpDown控件这样工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-28 11:45:15

只需根据需要设置NumericUpDown控件显示的小数位数:

代码语言:javascript
复制
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

我们只对数字的小数部分感兴趣。我们不想要任何尾随的零。

当转换为字符串时,小数将有两个前导字符(零和小数分隔符),除非它是负的,在这种情况下有三个前导字符(减号、零和小数分隔符)。

如果您不满意通过字符串获取小数位数,那么您可以这样做:

代码语言:javascript
复制
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]。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36260065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档