2008-11-17 45 views
15

Tôi muốn nhóm các chữ số thành gấp đôi hàng nghìn, nhưng cũng có thể xuất số số thập phân thực tế trong số. Tôi không thể tìm ra chuỗi định dạng.Định dạng một số bằng dấu phẩy, nhưng giữ số thập phân

1000 => 1,000 
100000 => 100,000 
123.456 => 123.456 
100000.21 => 100,000.21 
100200.123456 => 100,200.123456 

Phủ nhận (nó không phải là thẳng về phía trước như bạn nghĩ):

  • Xin đừng chỉ cho tôi đến this question nó không trả lời câu hỏi của tôi
  • Xin đừng chỉ cho tôi đến MSDN, các bài viết đã không giúp tôi. (Nếu bạn tin tôi đọc chúng không đúng cách, đọc chúng mình và gửi câu trả lời đúng)
  • .ToString("n") không hoạt động, nó vòng các chữ số

Trả lời

10

này dường như thực hiện chính xác những gì bạn muốn:

public void Code(params string[] args) 
{ 
    Print(1000); 
    Print(100000); 
    Print(123.456); 
    Print(100000.21); 
    Print(100200.123456); 
} 

void Print(double n) 
{ 
    Console.WriteLine("{0:###,###.#######}", n); 
} 

1,000 
100,000 
123.456 
100,000.21 
100,200.123456 
+0

Nếu bạn có nhiều hơn 7 chữ số thập phân, sẽ không cắt bớt nó? – MusiGenesis

+0

Nó xuất hiện như vậy, đó là ít hơn lý tưởng, nhưng tôi có thể đẩy nó ra 12 chữ số thập phân mà nên là một giới hạn cho các mục đích của tôi. –

+1

Tuy nhiên, sẽ không làm việc cho một số thập phân tùy ý. Vì đôi có độ chính xác 15-16 chữ số, mặc dù "{0: ##, ###, ###, ###, ###, ## 0. ############ ###} "dường như nắm bắt tất cả các cặp đôi có thể với tất cả các chữ số có thể. Chú ý tôi thích một hàng đầu 0. – tvanfosson

0

Hãy thử điều này một:

VB:

Dim vals() As Double = {1000, 100000, 123.456, 100000.21, 100200.123456} 
For Each val As Double in vals 
    Console.WriteLine(val.ToString("###,###.#########")) 
Next val 

C#:

double[] vals = new double[] {1000, 100000, 123.456, 100000.21, 100200.123456}; 
foreach (double val in vals) 
{ 
    Console.WriteLine(val.ToString("###,###.#########")); 
} 

T vấn đề là không có định dạng để xử lý một số thập phân tùy ý. Tuy nhiên, vì bạn chỉ có thể lưu trữ độ chính xác rất hạn chế, bạn chỉ có thể sử dụng và thêm một vài ký tự nếu cần để che nó, giả sử bạn sẵn sàng để cắt bỏ bất kỳ số 0 không đáng kể nào.

Và liên kết MSDN bạn đã đăng là nơi chính xác bạn muốn đọc cách thực hiện việc này.

1

Hãy thử đơn giản là sử dụng "#, #", điều này có thêm dấu phẩy cho hàng ngàn et al, nhưng tôi không biết nếu nó sẽ giữ cho số thập phân , nếu không "#, ###. ####################", hoặc bất kỳ số biểu tượng '#' nào bạn muốn sau dấu thập phân.

0

Đây có thể là một chút chậm, nhưng nó sẽ làm những gì bạn muốn.

public static string FormatNumber(double num) 
{ 
    string s = num.ToString(); 
    string result = ""; 

    if(s.IndexOf('.') != -1) 
    { 
     result = s.Substring(s.IndexOf('.')); 
     s = s.Substring(0, s.IndexOf('.')); 
    } 

    while (s.Length > 3) 
    { 
     result = "," + s.Substring(s.Length - 3); 
     s = s.Substring(0, s.Length - 3); 
    } 
    if (s.Length == 0) 
     return result.Substring(1); 
    return s + result; 
} 
+1

Downvoting là một chút khắc nghiệt đối với một cái gì đó mà trả lời câu hỏi không? Mặc dù nó không phải là giải pháp tốt nhất, nó là một giải pháp. – LeppyR64

2

Một chủ đề cũ nhưng không có câu trả lời nào hoàn toàn phù hợp với tôi. Hầu hết trong số họ biến số không thành chuỗi rỗng, bao gồm cả chuỗi có số lượng upvotes nhiều nhất.

Tôi nghĩ giải pháp tốt hơn là "#,##0.#################", ít nhất là hiển thị số không. Nó vẫn còn xấu xí mặc dù. Phải có cách tốt hơn.

double[] vals = new double[] { 0.0, 0.1234, -0.1234, 1.0, 
           123456789.123456, 123456789.0, 
           0.123456789123456 }; 
foreach (double val in vals) 
{ 
    Console.WriteLine(val + ": " + val.ToString("#,##0.#################")); 
} 
Các vấn đề liên quan