2013-02-19 31 views
16

Tôi vừa xem qua "tính năng" tuyệt vời mà .NET sẽ theo mặc định làm Double.ToString() sử dụng ký pháp khoa học nếu có đủ chữ số thập phân.Double ToString - Không có ký pháp khoa học

.005.ToString() // ".005" 
.00005.ToString() // "5E-05" 

Có ai biết cách hiệu quả để làm cho chuỗi này xuất hiện dưới dạng chuỗi ký hiệu chuẩn (phi khoa học) không?

Tôi đã xem this question, nhưng hai câu trả lời hàng đầu có vẻ như là loại hacky với tôi vì cả hai đều làm Double.ToString() và sau đó chỉ định dạng lại kết quả.

Cảm ơn bạn đã được trợ giúp.

EDIT:

Kết quả mong muốn:

.00005.ToString() == ".00005" 

EDIT2:

là gì với tất cả các bản sao và phiếu gần? Tôi đặc biệt nói trong câu hỏi rằng câu hỏi tương tự không có câu trả lời thỏa đáng. Mọi người trên trang web này nhận được cách quá sức mạnh hạnh phúc.

GIẢI PHÁP CỦA TÔI:

Trong trường hợp đó là hữu ích cho bất cứ ai:

/// <summary> 
/// Converts the double to a standard notation string. 
/// </summary> 
/// <param name="d">The double to convert.</param> 
/// <returns>The double as a standard notation string.</returns> 
public static String ToStandardNotationString(this double d) 
{ 
    //Keeps precision of double up to is maximum 
    return d.ToString(".#####################################################################################################################################################################################################################################################################################################################################"); 

} 

Chú ý: Đây chỉ làm việc cho các giá trị> 1. Tôi đã không tìm thấy một cách hiệu quả để làm điều này cho tất cả các giá trị chưa .

+0

Bạn nhận ra rằng, ở dưới kim loại của máy tính, các số dấu phẩy động được lưu trữ với số lượng ký hiệu khoa học cơ bản-2. Đây không phải là một "tính năng" châm biếm; hành vi là không thể thiếu đối với loại. Trong khi nó có thể hiển thị nổi trong định dạng thập phân hoàn toàn (tôi hỗ trợ câu trả lời của Tim S về điều này), một số như 2.68E201 sẽ chỉ đơn giản là có * lot * của số không. – KeithS

+1

@KeithS ToString() phải có hành vi nhất quán, bất kể phần cứng. Đó là toàn bộ điểm trừu tượng mà tất cả các chương trình hiện đại đều dựa vào. Người ta hy vọng rằng để có được một cái gì đó trong ký hiệu khoa học, người ta sẽ xác định điều đó. – MgSam

+0

Tôi không thể trả lời được nữa, nhưng bạn có thể truyền 'double' thành' decimal' và sau đó thực hiện 'ToString()'. Tôi đã không thực hiện kiểm tra hiệu năng nhanh hơn, 'thập phân' hoặc chuỗi định dạng có hơn 300 ký tự. – ygoe

Trả lời

13

Xem StandardCustom Numeric Format Strings. Tôi nghĩ rằng bạn đang tìm kiếm ".################":

.00005.ToString(".################") // returns ".00005" 

Đó là một chút hackish, vâng, nhưng nó hoạt động, miễn là bạn không có nhiều hơn thế nhiều nơi sau khi thập phân. Nếu có, bạn có thể muốn sử dụng một số StringBuilder để tạo khoảng 330 # s trong chuỗi của bạn (double.Epsilon là theo thứ tự của E-324).

+0

Tôi sợ điều này có thể là cách hợp lý duy nhất. Nó có hiệu quả hơn để làm cho chiều dài 324 ". ###" chuỗi một hằng số mặc dù, thay vì tính toán nó trong thời gian chạy. – MgSam

+1

@MgSam Hiệu quả hơn, chắc chắn ... nhưng nếu bạn chỉ tính toán nó một lần và lưu nó, hiệu quả là không đáng kể. Và sự rõ ràng thu được từ việc tạo chuỗi thông qua một vòng lặp có thể đáng giá ... bạn có thể thấy chính xác chuỗi đó là bao lâu và có nhận xét là tại sao ... và dễ dàng điều chỉnh nó nếu bạn thay đổi từ gấp đôi thành một phao hoặc bất cứ điều gì, vv Điều này có lẽ nhận được một chút quá nitpicky, tuy nhiên. – Beska

+2

@Beska Sử dụng vòng lặp sẽ là vô nghĩa khi bạn có thể thực hiện 'var format =". " + chuỗi mới ('#', 324) ' – Lukazoid

Các vấn đề liên quan