将小双精度值转换为字符串时如何避免科学记数法?
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.Text
到 1H 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()
来验证输入。
我需要计算两个标签的值之间的差异,我使用以下代码正确地完成了:
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")
您可以使用.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()
来验证输入。