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

How to avoid scientific notation when converting small double values to string?

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

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

(PREZZO) 是一个字符串。

当差异非常小时就会出现问题,就像我的情况 0.00008,所以我得到的结果是 8e-5
没有科学计数法怎么才能得到正常数呢?

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

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

的值

代码:

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

您可以使用.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)

如果您没有该数据的数字源并且您实际上需要解析 UI 元素的内容,则插入数据时使用的文化很重要,因为并非所有文化都使用逗号作为小数分隔符:如果当前 UI 文化(Thread.CurrentThread.CurrentCulture and Thread.CurrentThread.CurrentUICulture) don't match the input format (you show input that uses a comma instead of a dot - as the InvariantCulture - 分隔小数部分),则文本将无法正确解析或根本无法解析。

如果您有使用特定区域性格式的文本输入,则需要解析该输入并指定相应的 CultureInfo
数字没有格式:如果您有数字源,请将其用于计算,然后使用目标 UI 文化呈现数据以提供这些值的本地化表示。

如果输入的 Culture 和当前的 Culture 相同,那么在解析字符串值时不需要指定 CultureInfo,因为使用 Thread.CurrentThread.CurrentCulture 返回的 Culture。


假设输入格式基于十进制数字的意大利语格式(假设基于名称 PREZZO 的使用,Google Translate 将其检测为意大利语),您可以创建一个提供该文化中使用的标准格式的 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定义的Currency格式和Symbol,精度为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