2008-12-10 19 views
9

में स्ट्रिंग के रूप में मैं एक डबल जो 1,000,000,000.000प्रारूपण डबल सी #

मैं एक स्ट्रिंग के रूप में इस संख्या को फ़ॉर्मेट करना चाहते हैं लेकिन सशर्त अपने आकार के आधार पर करने के लिए चारों ओर 0.000001 से एक मान सकता है। तो यह बहुत छोटा है अगर मैं की तरह कुछ के साथ स्वरूपित करना चाहते हैं:

String.Format("{0:.000000000}", number); 

अगर यह है कि छोटे नहीं है, 0.001 कहना तो मैं

String.Format("{0:.00000}", number); 

की तरह कुछ का उपयोग करना चाहते हैं और अगर यह खत्म हो गया, 1000 का कहना है

String.Format("{0:.0}", number); 

वहाँ इस प्रारूप मूल्य मैं फ़ॉर्मेट करने के लिए जा रहा हूँ के आकार के आधार स्ट्रिंग के निर्माण के लिए एक चतुर तरीका है: तब के रूप में यह प्रारूप?

उत्तर

15

डबल स्थान के पूर्ण मूल्य के Math.Log10 का उपयोग करने के लिए यह पता लगाने के लिए कि कितने 0 को आपको दशमलव स्थान के बाएं (यदि सकारात्मक है) या दाएं (यदि नकारात्मक) की आवश्यकता है। इस मान के आधार पर प्रारूप स्ट्रिंग चुनें। आपको अलग-अलग शून्य मानों को संभालने की आवश्यकता होगी।

string s; 
double epislon = 0.0000001; // or however near zero you want to consider as zero 
if (Math.Abs(value) < epislon) { 
    int digits = Math.Log10(Math.Abs(value)); 
    // if (digits >= 0) ++digits; // if you care about the exact number 
    if (digits < -5) { 
     s = string.Format("{0:0.000000000}", value); 
    } 
    else if (digits < 0) { 
     s = string.Format("{0:0.00000})", value); 
    } 
    else { 
     s = string.Format("{0:#,###,###,##0.000}", value); 
    } 
} 
else { 
    s = "0"; 
} 

या अंकों की संख्या के आधार पर इसे गतिशील रूप से बनाएं।

2

स्ट्रिंग में वैकल्पिक पदों के लिए # वर्ण का उपयोग करें:

string.Format("{0:#,###,##0.000}", number); 

मुझे नहीं लगता कि आपको लगता है कि डबल इच्छा संभावना गड़बड़ बातें की शुद्धता के रूप में की तरह दशमलव स्थानों की संख्या को नियंत्रित कर सकते हैं।

यह तय करने के तर्क को समाहित करने के लिए कि आप कस्टम फॉर्मेटर बनाने के लिए कितने दशमलव स्थान देख सकते हैं।

2

अपने प्रश्न में पहले दो String.Format स्वचालित रूप से पीछे चल शून्य को हटाने के द्वारा हल किया जा सकता: 1000 से अधिक

String.Format("{0:#,##0.########}", number); 

और पिछले एक आपको बुला रहा गणित.गोल द्वारा हल कर सकते थे (संख्या, 1) मूल्यों के लिए और उसके बाद एक ही स्ट्रिंग का उपयोग करें। फोर्मेट।

कुछ की तरह:

String.Format("{0:#,##0.########}", number<1000 ? number : Math.Round(number,1)); 
1

तो यह मेरे थे, मैं एक कस्टम आवरण वर्ग लिख सकते हैं और अपने ToString विधि में tvanfosson के कोड डाल चाहते हैं। इस तरह आप अभी भी दोहरे मूल्य के साथ काम कर सकते हैं, लेकिन आपको बस सभी मामलों में सही स्ट्रिंग का प्रतिनिधित्व मिल जाएगा। यह कुछ इस तरह दिखाई चाहते हैं:

class FormattedDouble 
{ 
    public double Value { get; set; } 

    protected overrides void ToString() 
    { 
     // tvanfosson's code to produce the right string 
    } 
} 

शायद यह है कि यह एक struct बनाने के लिए बेहतर हो सकता है, लेकिन मुझे शक है यह एक बड़ा अंतर होगा। आप इस तरह वर्ग इस्तेमाल कर सकते हैं:

var myDouble = new FormattedDouble(); 
myDouble.Value = Math.Pi; 
Console.WriteLine(myDouble); 
2

OwenP के पर (और द्वारा "एक्सटेंशन" tvanfosson) अप के बाद: यदि यह काफी आम है

, और आप सी # 3 पर हैं।0, मैं इसे एक विस्तार विधि में बदल जाते हैं चाहते हैं डबल पर:

class MyExtensions 
{ 
    public static string ToFormmatedString(this double d) 
    { 
     // Take d and implement tvanfosson's code 
    } 
} 

अब कहीं भी आप एक डबल आप कर सकते हैं:

double d = 1.005343; 
string d_formatted = d.ToFormattedString(); 
संबंधित मुद्दे