2013-02-19 15 views
16

मैं अभी अद्भुत "फीचर" में आया हूं कि .NET डिफ़ॉल्ट रूप सेDouble.ToString() पर्याप्त दशमलव स्थानों पर वैज्ञानिक नोटेशन का उपयोग कर करेगा।डबल टूस्ट्रिंग - कोई वैज्ञानिक नोटेशन

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

क्या कोई इसे मानक (गैर-वैज्ञानिक) नोटेशन में स्ट्रिंग के रूप में प्रकट करने के लिए एक प्रभावी तरीका जानता है?

मैंने this question देखा है, लेकिन शीर्ष दो उत्तरों मुझे हैकी लगता है क्योंकि वे दोनों Double.ToString() करते हैं और फिर परिणामों को दोबारा सुधारते हैं।

किसी भी मदद के लिए धन्यवाद।

संपादित करें:

वांछित आउटपुट:

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

EDIT2:

सभी डुप्लिकेट और करीब वोटों के साथ क्या है? मैं विशेष रूप से पर सवाल में बताता हूं कि इसी तरह के प्रश्न का कोई संतोषजनक उत्तर नहीं है। इस वेबसाइट पर लोग रास्ता बहुत खुश हैं।

मेरा समाधान:

/// <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(".#####################################################################################################################################################################################################################################################################################################################################"); 

} 

नोट::

मामले में यह किसी को भी उपयोगी है मूल्यों के लिए यह केवल काम करता है> 1. मैं सभी मूल्यों के लिए अभी तक यह करने के लिए एक कारगर तरीका नहीं मिला है ।

+0

आपको एहसास है कि, कंप्यूटर के धातु पर नीचे, फ्लोटिंग-पॉइंट नंबर बेस-2 वैज्ञानिक नोटेशन की मात्रा में संग्रहीत किए जाते हैं। यह एक व्यंग्यात्मक "विशेषता" नहीं है; व्यवहार प्रकार के अभिन्न अंग है। हालांकि फ्लोट को पूरी तरह दशमलव प्रारूप में प्रदर्शित करना संभव है (मैं इस पर टिम एस के उत्तर का समर्थन करता हूं), 2.68E201 जैसे नंबरों में बस शून्य का * बहुत * होगा। – KeithS

+1

@KeithS ToString() हार्डवेयर के बावजूद लगातार व्यवहार होना चाहिए। यह सार तत्वों का पूरा बिंदु है जिस पर सभी आधुनिक प्रोग्रामिंग आधारित हैं। कोई उम्मीद करेगा कि वैज्ञानिक नोटेशन में कुछ प्राप्त करने के लिए, कोई इसे निर्दिष्ट करेगा। – MgSam

+0

मैं अब और जवाब नहीं दे सकता, लेकिन आप 'डबल' से' दशमलव' डाल सकते हैं और फिर 'ToString() 'कर सकते हैं। मैंने प्रदर्शन परीक्षण नहीं किया है जो तेज, 'दशमलव' या 300 से अधिक वर्णों की एक प्रारूप स्ट्रिंग है। – ygoe

उत्तर

13

Standard और Custom Numeric Format Strings देखें। मुझे लगता है कि आप ".################" लिए देख रहे हैं:

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

यह कुछ हद तक hackish है हाँ, लेकिन यह काम करता है, जब तक आप दशमलव के बाद यह है कि कई स्थानों की तुलना में अधिक की जरूरत नहीं है के रूप में। यदि आप करते हैं, तो आप अपनी स्ट्रिंग में 330 # एस बनाने के लिए StringBuilder का उपयोग करना चाहेंगे (double.Epsilon ई -324 के क्रम में है)।

+0

मुझे डर था कि यह एकमात्र उचित तरीका हो सकता है। 324 लंबाई "###" को रनटाइम पर गणना करने के बजाए स्थिर बनाते हुए यह अधिक कुशल है। – MgSam

+1

@MgSam अधिक प्रभावशाली, सुनिश्चित करें ... लेकिन यदि आप केवल इसे एक बार कंप्यूटिंग कर रहे हैं और इसे सहेज रहे हैं, तो प्रभावशीलता नगण्य है। और एक लूप के माध्यम से स्ट्रिंग उत्पन्न करने से प्राप्त स्पष्टता इसके लायक हो सकती है ... आप देख सकते थे कि स्ट्रिंग कितनी देर तक थी, और इस बारे में एक टिप्पणी है कि ... और यदि आप कभी भी डबल से बदलते हैं तो इसे आसानी से समायोजित करें एक फ्लोट या जो भी हो, इत्यादि। हालांकि, शायद यह थोड़ा अधिक नाटकीय हो रहा है। – Beska

+2

@ बेस्का एक लूप का उपयोग करना व्यर्थ होगा जब आप 'var format = "कर सकते हैं।" + नई स्ट्रिंग ('#', 324) ' – Lukazoid

संबंधित मुद्दे