2009-10-21 29 views
3

我要依靠的說,沒有問題是一個愚蠢的問題,但我有一個稍微愚蠢的問。更簡單的方法來防止數字顯示在指數記號

編輯:

看來,這個問題已經被問及這裏已經回答了幾次,但使用的標題爲重複搜索時,我沒遇到過。下面是一些相關的帖子:

  1. Double to string conversion without scientific notation
  2. How to convert double to string without the power to 10 representation (E-05)
  3. 將有一個答案(喬恩斯基特):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" 

這就是我想要的,但有沒有更好的辦法做到這一點,而不是有一個巨大的醜陋的格式字符串呢?所以,好吧,這不是那麼難看,但肯定有一種不同的方式,對吧?我的目標是以友好的方式顯示存儲在數據庫中的原始值,並且我寧願不必強制根據數字格式。

謝謝!

UPDATE

也許我說在後有點過分。經過一番實驗後,我發現將基礎數據類型更改爲Decimal可解決此問題。

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

所以聽起來好像Double s不夠精確,無法正常顯示?

EDIT

found a post(雖無upvotes)做在其上的.ToString(),其具有預期的效果之前,簡單地鑄雙值作爲十進制。我有什麼理由不想這樣做?或許對Decimal的演員陣容可能會以與Double不同的值結束(儘管數量可以忽略不計),所以#,##0.#################...格式字符串可能更安全。

+0

看看這個 - http://stackoverflow.com/questions/1546113/double-to-string-conversion-without-scientific-notation。 Jon Skeet的實用類看起來很有前景。 – RichardOD 2009-10-21 19:49:47

+0

哦,順便說一句,這絕對不是一個愚蠢的問題! – RichardOD 2009-10-21 19:51:46

+0

@RichardOD:喬恩的實用課程正是我想要的解決方案,雖然看起來有點矯枉過正。我真的不需要19位數以上的精度,而數據庫也不會在精度上超過精度的兩倍(也不需要)。如果你把你的評論變成答案,我會很樂意接受它作爲答案。 – 2009-10-21 21:21:19

回答

3

使您的格式字符串不變(例如在您的資源文件中)並按名稱使用它。你避免看到醜陋的格式,並獲得從控制到格式控制的一致性(即,如果你改變了主意,所有控件都會獲得新的外觀)。

作爲替代(或聯合),從文本框派生自定義控件,並具有調用您希望使用的不同格式化字符串的屬性,使用更簡單的語法。

無論哪種方式,你的目標不應該重複自己...通過將配置放置在一個地方,你最終避免誤入歧途,並且必須追蹤一個奇怪的格式化錯誤。

我們通過創建封裝所有格式和解析要求的「百分比」和「貨幣」文本控件來做類似的事情。他們的工作方式就像文本控件一樣。

+0

在我的文章中查看我的__update__和__edit__。 – 2009-10-21 20:28:54

+0

顯然你發現更簡單。 Double不像Decimal那樣「精確」(專門用於處理十進制貨幣金額而沒有二進制舍入問題)。如果你只投出展出,我懷疑在大多數情況下它會奏效。然而,如果你計算得到0.9999999類型的結果而不是1.0,那麼double會遇到問題。如果這不是問題,那麼演員陣容就足夠了。儘管如此,有一個「百分比」和「貨幣」專用控制需要很多猜測和冗餘的問題。 – Godeke 2009-10-21 23:49:43

+0

要回答「爲什麼」的問題......默認的格式化程序(這是ToString()使用的)恰好在相當窄的範圍內翻轉到科學範圍。這就是爲什麼你必須使用明確的格式來獲得你想要的。 (你實際上並不是從一個事物轉換到另一個事物,它們只是同一事物的不同輸出表示。) – Godeke 2009-10-22 00:10:29