4

我将依靠这句话,没有问题是一个愚蠢的问题,但我有一个稍微愚蠢的问题要问。

编辑:

似乎这个问题已经在这里被问过并回答了几次,尽管使用我在搜索重复项时没有遇到的标题。以下是一些相关的帖子:

  1. 没有科学记数法的双精度字符串转换
  2. 如何在没有 10 表示的情况下将 double 转换为字符串 (E-05)
  3. 有答案的地方 (Jon Skeet):http ://www.yoda.arachsys.com/csharp/DoubleConverter.cs

原始问题:

我有一个应用程序,有时会存储一些相当小的数字,例如0.000023425. 这些数字被加载到TextBox控件中供用户编辑。以下人为示例显示了我的问题:

Dim number As Double = 0.000023425
someTextBox.Text = number.ToString() ' Shows "2.3425E-05"

如前所述,显示的文本是2.3425E-05,这对于用户来说并不完全直观,而且我的数字更加精确(精确到小数点后 19 位)。我希望输出是定点的。当然,我可以轻松干净地做到:

number.ToString("F20") ' Shows "0.00002342500000000000"

但随后会留下令人讨厌的零。所以,要解决这个问题,我可以这样做:

number.ToString("#,##0.####################") ' Shows "0.000023425"

这就是我想要的,但是有没有比在那里拥有那个巨大的丑陋格式字符串更好的方法呢?所以,好吧,它不是那么难看,但肯定有不同的方式,对吧?我的目标是以友好的方式显示存储在数据库中的原始值,我宁愿完全不必对数字强制格式。

谢谢!

更新

也许我在帖子里说的有点太多了。经过一些实验,我发现更改底层数据类型可以Decimal解决问题。

Dim number As Decimal = 0.000023425
someTextBox.Text = number.ToString() ' Shows "0.000023425" instead of "2.3425E-05"

所以听起来Doubles 不够精确,无法正常显示?

编辑

发现了一个帖子(尽管没有赞成票),它只是在对其进行 a 之前将 Double 值转换为 Decimal .ToString(),这具有预期的效果。有什么理由我不想这样做吗?也许强制转换Decimal有可能以与 the 不同的值结束Double(即使它的数量可以忽略不计),所以#,##0.#################...格式字符串可能更安全。

4

1 回答 1

3

使您的格式字符串成为常量(例如在您的资源文件中)并按名称使用它。您避免看到丑陋的格式,并在您的格式中从控件到控件获得一致性(即,如果您改变主意,所有控件都将获得新外观)。

作为替代方案(或结合使用),从文本框派生自定义控件并具有调用您希望以更简单语法使用的不同格式字符串的属性。

无论哪种方式,您的目标都不应该重复自己......通过将配置放在一个地方,您最终可以避免输入错误并不得不追踪一个奇怪的格式错误。

我们通过创建封装所有格式和解析要求的“百分比”和“货币”文本控件来做类似的事情。它们就像文本控件一样工作,否则。

于 2009-10-21T19:22:47.980 回答