2010-01-21 176 views
15

我有具有.後的可變數目的數字的十進制值的末尾刪除0,例如:從十進制值

0.0030 
0.0310 
0.0001 
1.1200 

如何可以寫一個動態函數的是,在除去0小數點的結尾?

回答

20
string.Format("{0:0.#####}", 0.0030) 

var money=1.3000m; 
money.ToString("0.#####"); 

以供將來參考我由約翰·希恩建議.NET Format String Quick Reference

+2

是的,但如果你可能有6位小數或7?你最終會出現一個投機性的醜陋的#字符。 – 2010-01-21 13:47:31

+2

這會將數字舍入到最接近的萬分之一。這可能或不可能是OP想要的。 – 2010-01-21 13:57:33

+3

@ andrew-m是#是一個數字佔位符。在大多數情況下,你知道想要的精度是多少。如果你不想並且想要絕對確定你可以使用你當前使用的數據類型的全部精度。 「小數」可以保存28-29個有效數字。 Hacky解決方案:'.ToString(「0。」。PadRight(29,'#'))' – 2010-01-21 14:47:51

3

嗯,這是一個顯示格式問題(將十進制轉換爲字符串時添加了零)。

您需要查看代碼中您看到尾部零的位置。是否在調用.ToString()之後?嘗試使用不同的格式化字符串:

.ToString("#"); 
.ToString("0.00"); 
.ToString("#.##"); 

依此類推。做到這一點的最好方法就是試驗不同的可能值。

2
decimal m = 0.030000m; 
Console.Write(m.ToString("0.##########")); 

只要確保你有你想要顯示

9
decimal value = 0.0030m; 
value.ToString(「G29″); 

編輯小數位的數量足夠#秒:對於g格式不工作,唯一的問題是,它跳到科學記數法如果原始小數中有太多有效數字。不太理想。

見 「將軍(」 G 「)格式說明」 文件位置:http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString

我在吃午飯,所以我做了一個小測試:

decimal d1 = 0.000100m; 
decimal d2 = 0.001000000000000000000000m; 
decimal d3 = 0.000000000000001000000000m; 

Console.WriteLine(Environment.NewLine + "input decimal: 0.000100m"); 
Console.WriteLine("G   " + d1.ToString("G")); 
Console.WriteLine("G29  " + d1.ToString("G29")); 
Console.WriteLine("0.####### " + d1.ToString("0.#######")); 

Console.WriteLine(Environment.NewLine + "input decimal: 0.001000000000000000000000m"); 
Console.WriteLine("G   " + d2.ToString("G")); 
Console.WriteLine("G29  " + d2.ToString("G29")); 
Console.WriteLine("0.####### " + d2.ToString("0.#######")); 

Console.WriteLine(Environment.NewLine + "input decimal: 0.000000000000001000000000m"); 
Console.WriteLine("G   " + d3.ToString("G")); 
Console.WriteLine("G29  " + d3.ToString("G29")); 
Console.WriteLine("0.####### " + d3.ToString("0.#######")); 

輸出:

input decimal: 0.000100m 
G   0.000100 
G29  0.0001 
0.####### 0.0001 

input decimal: 0.001000000000000000000000m 
G   0.001000000000000000000000 
G29  0.001 
0.####### 0.001 

input decimal: 0.000000000000001000000000m 
G   0.000000000000001000000000 
G29  1E-15 
0.####### 0 
0

我使用以下內容。它確保任何十進制數(最大精度爲29位小數)將顯示所有可用的精度數字,而不會拖尾零,並且不需要您的代碼需要一長串醜陋的散列標記。

if (value is Decimal) 
    value = ((Decimal)value).ToString("0.".PadRight(29, '#'), culture); 
25

您還可以修改小數點本身,以便任何的ToString()會給你你想要的東西 (在我的答案here更多細節):

public static decimal Normalize(decimal value) 
{ 
    return value/1.000000000000000000000000000000000m; 
} 
+8

此答案擁有,因爲與此基本上所有其他答案(甚至整個主題)不同,實際上都是WORKS,並且執行OP要求的內容。可恥地看到所有這些高級代表用戶急於在沒有閱讀/理解問題的情況下回答問題,並從一些甚至不工作的東西中得到所有的讚揚。 – Coxy 2011-12-13 01:34:02

-1
public static string GentlyRemoveEndZeros(string input) 
     { 
      // if (input == null) return null; 
      // if (input == "") return ""; 
      if (input.Contains(".")) return input.TrimEnd('0').TrimEnd('.'); 
      return input; 
     } 
+1

其他不使用「。」的語言環境如何? – 2014-07-11 09:09:05

+0

@MartinMulder同樣的方法:if(input.Contains(「,」))return input.TrimEnd('0')。TrimEnd(','); – VovaM 2016-10-27 04:38:35

+1

@VovaN:的確如此,但是您的答案不能跨文化證明? – 2016-11-03 09:01:08

-2

截斷尾隨零是非常容易,用雙工鑄造解決:

decimal mydecimal = decimal.Parse("1,45000000"); //(I) 
    decimal truncate = (decimal)(double)mydecimal; //(II) 

(I) - >分析十進制值來自任何字符串源。

(二) - >第一:拋出加倍這刪除尾隨零。第二:其他投到小數,因爲不存在從十進制隱式轉換爲雙和反之亦然a)

+0

您將假設所有的值都適合小數點,可以放入雙倍數。這可能會導致OverflowException。你也可能會失去精確性。 – 2014-07-11 09:10:23

+0

你認爲是錯誤的,你的評論沒有增加任何討論。很明顯,這裏所有的都假設該值可以適用於雙精度值和十進制值。這裏,溢出不是問題。 Regards !! – amedriveroperez 2014-07-11 17:14:01

+0

還有誰假設?我搜索了'雙'......沒有其他人假設這一點。 – 2014-07-12 10:13:00