将小双精度值转换为字符串时如何避免科学记数法?

时间:2021-03-17 11:05:19

标签: vb.net string-conversion

我需要计算两个标签的值之间的差异,并且我使用以下代码正确地进行了计算:

Label26.Text = (((CDbl(PREZZO) - CDbl(Label17.Text)) 

(PREZZO) 是一个字符串。

当差异非常小时就会出现问题,比如我的情况 0.00008,所以我得到 8e-5 作为结果。
没有科学记数法如何得到正常数?

编辑:
"F5" 格式化它似乎有效,但有时我仍然得到科学记数法,如下所示:

enter image description here enter image description here

字符串PREZZO对应Price €的值
Label17.Text1H AGO € 的值。

代码:

 (CDbl(PREZZO) - CDbl(Label16.Text)).tostring("F5")

2 个答案:

答案 0 :(得分:2)

如果您没有该数据的数字源,并且您实际上需要解析 UI 元素的内容,则插入数据时使用的文化很重要,因为并非所有文化都使用逗号作为小数点分隔符:如果当前的 UI文化(Thread.CurrentThread.CurrentCultureThread.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

答案 1 :(得分:0)

您可以使用 .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)
相关问题