C# .NET NumericUpDown,带小数=根据需要

C# .NET NumericUpDown,带小数=根据需要,c#,.net,vb.net,C#,.net,Vb.net,我有一种情况,需要进行循环计算,其中3个数字上下控制中的任何一个改变其值。所有这些控件都将属性“小数位数”设置为2。但有些数字需要更多的小数,如果我想在循环计算中得到正确的结果 所以现在我需要一个数字上下控制(不太重要)来改变小数的数量,如需要 例如,如果数字为1.2345,则控件应设置4位小数,如果为0.10,则控件应设置1位小数以显示数字。 当然,我希望这个属性根据需要显示的数字自动更改 要让NumericUpDown控件以这种方式工作,有什么建议吗?只需根据需要设置NumericUpDow

我有一种情况,需要进行循环计算,其中3个数字上下控制中的任何一个改变其值。所有这些控件都将属性“小数位数”设置为2。但有些数字需要更多的小数,如果我想在循环计算中得到正确的结果

所以现在我需要一个数字上下控制(不太重要)来改变小数的数量,如需要

例如,如果数字为1.2345,则控件应设置4位小数,如果为0.10,则控件应设置1位小数以显示数字。
当然,我希望这个属性根据需要显示的数字自动更改


要让NumericUpDown控件以这种方式工作,有什么建议吗?

只需根据需要设置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
对于要使用NumericUpDown控件的值范围,它应该有效。我不想将该方法用于双精度或单精度,因为许多小数不是以浮点格式精确表示的


请注意,从技术上讲,0.1与0.10不同-前者可以表示[0.05,0.15]范围内的数字,后者可以表示[0.95,1.05]范围内的数字。

只需根据需要设置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
它应该适用于您喜欢使用NumericUpDown控件的值范围。我不想将该方法用于双精度或单精度,因为许多小数不是以浮点格式精确表示的


请注意,从技术上讲,0.1与0.10不同-前者可以表示[0.05,0.15]范围内的数字,后者可以表示[0.05,0.15]范围内的数字[0.95,1.05)。

不清楚您打算如何理解用户的想法,这是猜测用户想要输入多少位数所需的功能。NUD不是合适的选择,请使用文本框。您可以处理它。Hans,这与用户的选择无关,而与小数位数有关。如果用户想在此处输入,请不要hen NUD不会再将其限制为任何小数位数。在他的输入后,我会验证它,然后根据他的输入设置小数位数。或者我认为是错的?很不清楚你打算如何理解用户的想法,这是猜测用户想要输入多少位数所需的功能。NUD不是合适的选择,请在中使用文本框代替。你可以处理它。汉斯,这不是关于用户的选择,而是关于数字有多少个小数。如果用户想在这里输入,NUD就不要再限制小数。在他的输入之后,我验证它,然后在那里我可以根据他的输入设置小数点。或者我认为错了?Thanx Andrew。我想避免字符串操作但好的,这是好的开始…@user1697111因为这是一个UI控件,我不会担心使用字符串操作。@user1697111我添加了一个避免字符串操作的方法。好的,我现在必须比较这些解决方案,选择哪一个看起来/工作得更好。我的NUD是子类化的,所以我可以在子类中使用此代码并打开/关闭它f有一个新的布尔属性,称为“DecimalPlacesAsNeeded”。Thanx.Thanx Andrew.I认为可以避免字符串操作,但好的,这可以开始…@user1697111因为这是一个UI控件,所以我不会担心使用字符串操作。@user1697111我添加了一个避免字符串操作的方法。好的,我现在和现在比较这些解决方案选择哪一个看起来/效果更好。我的NUD是子类化的,因此我可以在子类中使用此代码,并使用一个新的布尔属性打开/关闭它,如“DecimalPlacesAsNeeded”。Thanx。