2009-04-14 27 views
7

Làm cách nào để định dạng số thành số chữ số thập phân cố định (giữ số 0) theo số lượng địa điểm được chỉ định bởi một biến?Làm cách nào để định dạng số thập phân thành số thập phân được kiểm soát có lập trình trong C#?

ví dụ:

int x = 3; 
Console.WriteLine(Math.Round(1.2345M, x)); // 1.234 (good) 
Console.WriteLine(Math.Round(1M, x));  // 1 (would like 1.000) 
Console.WriteLine(Math.Round(1.2M, x)); // 1.2 (would like 1.200) 

Lưu ý rằng kể từ khi tôi muốn kiểm soát số vị trí programatically, string.Format này sẽ không hoạt động (chắc chắn tôi phải không tạo ra các chuỗi định dạng):

Console.WriteLine(
    string.Format("{0:0.000}", 1.2M)); // 1.200 (good) 

Nên tôi chỉ bao gồm Microsoft.VisualBasic và sử dụng FormatNumber?

Tôi hy vọng thiếu điều gì đó hiển nhiên ở đây.

Trả lời

12

Hãy thử

decimal x = 32.0040M; 
string value = x.ToString("N" + 3 /* decimal places */); // 32.004 
string value = x.ToString("N" + 2 /* decimal places */); // 32.00 
// etc. 

Hope làm việc này cho bạn. Xem

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

để biết thêm thông tin. Nếu bạn tìm thấy những phụ thêm một chút hacky thử:

public static string ToRoundedString(this decimal d, int decimalPlaces) { 
    return d.ToString("N" + decimalPlaces); 
} 

Sau đó, bạn chỉ có thể gọi

decimal x = 32.0123M; 
string value = x.ToRoundedString(3); // 32.012; 
+0

Làm thế nào để xác định số thập phân như là một biến? Tôi cho rằng tôi có thể làm (1.2M). ToString ("D" + x) nhưng điều đó có vẻ hơi khó hiểu –

+0

Bạn luôn có thể biến nó thành một phương pháp mở rộng. –

+0

Nó đang phát triển trên tôi, cũng nhờ phương pháp mở rộng. –

2

Xem các liên kết cho chuỗi định dạng hỗ trợ:
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Bạn muốn điều này :

Console.WriteLine(Math.Round(1.2345M, x).ToString("F" + x.ToString())); 

Thêm vào đó, các cuộc gọi ToString sẽ tròn cho bạn nếu cần thiết để bạn có thể bỏ qua Math.Round cuộc gọi và chỉ làm điều này:

Console.WriteLine(1.2345M.ToString("F" + x.ToString())); 
+0

OK, do đó, tạo chuỗi định dạng ("F" + x.ToString()) là thủ thuật, sau đó? Tôi cho rằng tôi vừa thiếu thư viện. Cảm ơn, Joel! –

+0

Nhưng ...bạn đã mô tả chính xác điều tương tự trong các bình luận của câu trả lời ở trên là "hacky"? –

+0

Một khi là một hack. Hai lần là một thực hành tốt nhất.

1

Something như thế này nên xử lý nó:

int x = 3; 
string format = "0:0."; 
foreach (var i=0; i<x; i++) 
    format += "0"; 
Console.WriteLine(string.Format("{" + format + "}", 1.2M)); 
4

Hãy thử điều này để tự động tạo chuỗi định dạng của riêng bạn mà không phải sử dụng nhiều bước.

Console.WriteLine(string.Format(string.Format("{{0:0.{0}}}", new string('0', iPlaces)), dValue)) 

Trong bước

//Set the value to be shown 
decimal dValue = 1.7733222345678M; 

//Create number of decimal places 
int iPlaces = 6; 

//Create a custom format using the correct number of decimal places 
string sFormat = string.Format("{{0:0.{0}}}", new string('0', iPlaces)); 

//Set the resultant string 
string sResult = string.Format(sFormat, dValue); 
0

Phương pháp để làm điều đó:

private static string FormatDecimal(int places, decimal target) 
     { 
      string format = "{0:0." + string.Empty.PadLeft(places, '0') + "}"; 
      return string.Format(format, target); 
     } 
Các vấn đề liên quan