如何解决将小双精度值转换为字符串时如何避免科学记数法?
我需要计算两个标签的值之间的差异,并且我使用以下代码正确地进行了计算:
Label26.Text = (((CDbl(PREZZO) - CDbl(Label17.Text))
(PREZZO)
是一个字符串。
当差异非常小时就会出现问题,比如我的情况 0.00008
,所以我得到 8e-5
作为结果。
没有科学记数法如何得到正常数?
编辑:
用 "F5"
格式化它似乎有效,但有时我仍然得到科学记数法,如下所示:
字符串PREZZO
对应Price €
的值Label17.Text
到 1H AGO €
的值。
代码:
(CDbl(PREZZO) - CDbl(Label16.Text)).tostring("F5")
解决方法
如果您没有该数据的数字源,并且您实际上需要解析 UI 元素的内容,则插入数据时使用的文化很重要,因为并非所有文化都使用逗号作为小数点分隔符:如果当前的 UI文化(Thread.CurrentThread.CurrentCulture 和 Thread.CurrentThread.CurrentUICulture)与输入格式不匹配(您显示的输入使用逗号而不是点 - 作为 InvariantCulture - 分隔小数部分),然后文本将无法正确解析或根本无法解析。
如果您有使用特定区域性格式的文本输入,则需要解析该输入并指定相应的 CultureInfo。
数字没有格式:如果您有数字源,请使用它进行计算,然后使用目标 UI 文化呈现数据以提供这些值的本地化表示。
如果输入的 Culture 和当前的 Culture 相同,那么解析字符串值时不需要指定 CultureInfo,因为使用的是 Thread.CurrentThread.CurrentCulture
返回的 Culture。
假设输入格式基于十进制数的意大利语格式(假设基于名称 PREZZO
的使用,谷歌翻译将其检测为意大利语),您可以创建一个 CultureInfo,提供使用的标准格式在那种文化中。
解析字符串值时,将此 CultureInfo 传递给方法,以便正确解析文本。
此外,由于您处理的是货币,因此不要使用 Double 或 CDbl
来解析这些值,而是使用 Decimal.Parse()。例如:
Dim PREZZO = "0,04831"
Dim currentPrice = Label16.Text ' "0,04840"
Dim culture = CultureInfo.CreateSpecificCulture("it-IT")
Dim price = Decimal.Parse(PREZZO,culture)
Dim price1Year = Decimal.Parse(currentPrice,culture)
Dim priceDiff = price1Year - price
Dim priceDiffPercent = priceDiff / price
现在,要显示计算出的价格变化和变化百分比,您需要使用相同的 CultureInfo 重新格式化这些值:
labelDiffPrice.Text = priceDiff.ToString("N5",culture)
labelDiffCurrency.Text = priceDiff.ToString("C5",culture)
labelDiffPercent.Text = priceDiffPercent.ToString("P5",culture)
N5
指定精度为 5 位十进制值的数字。C5
种使用由 CultureInfo 定义的货币格式和符号,精度为 5 个十进制值。这会覆盖 CultureInfo.NumberFormat.CurrencyDecimalDigits,因此它应该用于特定目的,如本例所示。P5
一个数字乘以 100
的百分比表示,精度为 5 个小数位。
两个计算值将显示为:
' Variation in price
0,00009
' Variation in price expressed in currency
€ 0,00009
' Percentage of the variation
0,18630%
如果输入直接来自用户,请使用 Decimal.TryParse() 而不是 Decimal.Parse()
来验证输入。
另见:Standard numeric format strings
,您可以使用 .ToString("F"&c) 而不是 "F5",因为您不知道差分输入中有多少小数。所以我们可以计算输入中的位数,并找到伟大的数字并将其传递给 ToString("F" & c) 这里 c 是 2 个输入的更多位数。它不会总是大于那个。
Dim a = Len(Label1.Text)
Dim b = Len(Label2.Text)
Dim c
If a > b Then
c = a
Else
c = b
End If
TextBox1.Text = (CDbl(Label1.Text) - CDbl(Label2.Text)).ToString("F" & c)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。