2012-08-28 12 views
8

के साथ ToString (स्ट्रिंग प्रारूप) का समर्थन करना अपना स्वयं का नंबर (वास्तव में DoubleDouble) बनाने के बाद, मैं IFormattable इंटरफ़ेस को कार्यान्वित करना चाहता हूं। इसलिए मुझे प्रारूप स्ट्रिंग को किसी भी तरह से पार्स करना है।कस्टम नंबर प्रकार

public string ToString(string format, IFormatProvider formatProvider) { 
    // formatting string according to format and using formatprovider? 
    return formattedString; 
} 

वर्ग के उपयोगकर्ता double के लिए एक स्थानापन्न (या किसी अन्य संख्या स्वरूप) के रूप में उपयोग करने के लिए सक्षम होना चाहिए।

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

मेरा सवाल है, क्या कोई इस बारे में एक अच्छा ट्यूटोरियल जानता है या मुझे कुछ संकेत दे सकता है? इस प्रक्रिया में स्थानीयकरण का समर्थन कैसे करें?

स्वरूप स्ट्रिंग को कैसे पार्स करें? क्या इस कार्य में सहायता करने के लिए कुछ तरीके हैं या क्या मुझे इसे "हाथ" से regexp और ऐसा करने के लिए करना है?

मैंने वास्तव में मदद की खोज की लेकिन कोई भी नहीं मिला, अगर आपको किसी अन्य भाषा (सी, सी ++) में कुछ मिलता है जो मदद कर सकता है, तो कृपया मुझे इसके बारे में बताएं।

+1

मैं कस्टम विविधता पर पहुंचने से पहले मानक तारों से शुरू करूंगा। स्थानीयकरण के बारे में क्या? http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx – Jodrell

+0

मुझे यह काफी उपयोगी मिला - http://codebetter.com/davidhayden/2006/03/12/open-closed-principle-iformattable- iformatprovider-icustomformatter/ –

+0

मेरे पास पहले से एक ToString विधि है जो एक वैज्ञानिक नोटेशन देता है। जिस समस्या का सामना कर रहा हूं वह है कि प्रारूप स्ट्रिंग को कैसे पार्स करें और इसी नंबर को वापस कैसे करें। दिया गया लिंक बस बहुत ही बुनियादी संशोधक का उपयोग करता है। –

उत्तर

0

इस प्रक्रिया में स्थानीयकरण का समर्थन कैसे करें?

public string ToString(string format, IFormatProvider formatProvider) 
{ 
    CultureInfo culture = formatProvider as CultureInfo; 
    if (culture != null) 
    { 
    // Now you can do things like 
    // culture.NumberFormat.NumberDecimalSeparator, etc. 
    } 
} 

कैसे प्रारूप स्ट्रिंग पार्स करने में:

निम्नलिखित की तरह कुछ? क्या इस कार्य में सहायता करने के लिए कुछ तरीके हैं या क्या मुझे इसे "हाथ" द्वारा regexp के साथ करना है और ऐसा करना है?

आपके लिए ऐसा करने के लिए .NET ढांचे में कोई सार्वजनिक API नहीं है। यदि आप source को .NET आदिम संख्यात्मक प्रकारों के IFormattable के कार्यान्वयन के लिए देखते हैं, तो वे सभी अंततः बाह्य विधियों को कॉल करते हैं, इसलिए वे कोई अंतर्दृष्टि प्रदान नहीं करते हैं। प्रारूप स्ट्रिंग को पार्स करने के लिए आपको शायद RegEx की तरह कुछ उपयोग करने की आवश्यकता होगी। फिर आप 10 की सबसे बड़ी शक्ति से विभाजित कर सकते हैं यह पता लगाने के लिए कि आउटपुट का पहला अंक क्या होगा, उसमें घटाएं, फिर 10 की कम शक्ति के लिए दोहराएं जब तक कि आप सभी अंक उत्पन्न नहीं कर लेते।

0

हो सकता है कि यह आपकी मदद कर सकते हैं:

var my = DoFormat(123.0) 

public static string DoFormat(double myNumber) 
{ 

    var s = string.Format("{0:0.00}", myNumber); 

    if (s.EndsWith("00")) 
    { 
     return ((int)myNumber).ToString(); 
    } 
    else 
    { 
     return s; 
    } 
} 
1

MSDN एक Temperature वर्ग कि अपने स्वयं के कस्टम स्वरूप के साथ IFormattable इंटरफ़ेस लागू करता है की एक nice example है।

मुझे लगता है कि आप इसे पहले से ही जानते हैं; वैसे भी, आज मुझे पता चला है कि अगर आपके DoubleDouble वर्ग IFormattable इंटरफ़ेस तो लागू किया:

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

... पहले पैरामीटर है, जो मुझे लगता है के रूप में विशिष्ट प्रारूप "0.##" साथ DoubleDouble वर्ग के ToString(...) कार्यान्वयन कहेंगे के करीब है क्या तुम्हें चाहिए। हालांकि आपको अभी भी प्रारूप के उस हिस्से को पार्स करना होगा।

मैं अनुमान लगाता हूं कि प्रारूपित पार्सिंग में अत्यधिक प्रारूपित नेट लाइब्रेरी बाइनरी में गहराई से एम्बेड किया गया है, इसलिए आपको मदद करने के लिए कोई कस्टम पार्सिंग वर्चुअल विधियां नहीं मिलती हैं।

+0

ठीक है, मुझे अभी एहसास हुआ है कि उपरोक्त प्रश्न पर नाट की टिप्पणी पहले से ही एक महान ट्यूटोरियल से जुड़ी है। मेरा आखिरी पैराग्राफ यहां एकमात्र नई चीज है। – wardies

0

मैंने कुछ साल पहले एक जावास्क्रिप्ट नंबर स्वरूपण समारोह लिखा था जिसने प्रारूपित स्ट्रिंग्स के अधिकांश .NET तरीके की नकल की थी। यह आपके लिए सी # संस्करण लिखने में कुछ मदद हो सकती है। कम से कम यह आपको एक शुरुआती बिंदु दे सकता है।

https://github.com/flamewave/jquery-ui-numeric/blob/master/jquery-ui-numeric.js

स्क्रॉल सभी $ .formatNumber कार्य करने के लिए नीचे करने के लिए नीचे तरीका है।

नोट: अब मैं Globalize लाइब्रेरी का उपयोग करने के पक्ष में इस फ़ंक्शन को बनाए रखता हूं, जो आपको पार्सिंग प्रारूप स्ट्रिंग्स में कुछ अंतर्दृष्टि भी दे सकता है।

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