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

vh0rcniy  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(198)

我需要计算两个Label的值之间的差异,我使用以下代码正确地完成了这一操作:

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")
7jmck4yq

7jmck4yq1#

如果您没有该数据的数值来源,而且实际上需要剖析UI项目的内容,则插入数据时所使用的文化特性会很重要,因为并非所有文化特性都使用逗号做为小数分隔符号:如果当前的UI区域性(Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture)与输入格式不匹配(您显示使用逗号而不是圆点(如InvariantCulture)分隔小数部分的输入),则文本将无法正确解析或根本无法解析。
如果您有使用特定文化特性格式的文字输入,则需要剖析该输入,并指定Map的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

jljoyd4f

jljoyd4f2#

你可以用.ToString(“F”&c)代替“F5”,因为你不知道差分输入中有多少位小数。所以我们可以计算两个输入中的位数,找到最大的位数并将其传递给ToString(“F”& c),这里c是两个输入中的较大位数。它不总是大于这个数。

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)

相关问题