2012-07-19 15 views
32

के साथ दो बार पार करने के लिए पार्स स्ट्रिंग्स मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो मूल रूप से तारों की सरणी में तारों की एक सरणी को परिवर्तित करता है जहां सरणी में सभी युगल दशमलव सेट की संख्या के लिए गोल होते हैं। सरणी में तार भी हो सकते हैं जो कि कोई डबल मान नहीं है।अल्पविराम और बिंदु

string[,] values = new string[1, 3]; 

values[0, 0] = "hello"; 
values[0, 1] = "0.123"; 
values[0, 2] = "0,123"; 

int decimalPlaces = 2; 

double tmp; 
string format = "F" + decimalPlaces.ToString(); 
IFormatProvider provider = CultureInfo.InvariantCulture; 
for (int i = 0; i < values.GetLength(0); i++) 
{ 
    for (int j = 0; j < values.GetLength(1); j++) 
    { 
     if (double.TryParse(values[i, j], out tmp)) 
     { 
      values[i, j] = tmp.ToString(format, provider); 
     } 
    } 
} 

Console.ReadLine(); 

परिणाम हो गया है: "हैलो", "0.12", "0.12" लेकिन यह है "हैलो", "123.00", "0.12" गलत तरीके से अल्पविराम व्यवहार करेगा। क्या किसी के पास इसके लिए एक सरल और कुशल समाधान है?

उत्तर

26

आप डॉट (.) जैसे कॉमा (,) का इलाज करना चाहते हैं। तो,

if (double.TryParse(values[i, j].Replace('.', ','), out tmp)) 
+12

आपको पार्सिंग करते समय संस्कृति निर्दिष्ट करने की आवश्यकता है, अन्यथा यह केवल तभी काम करेगा जहां वर्तमान संस्कृति दशमलव बिंदु के रूप में "," का उपयोग करेगी। – hultqvist

+0

दाएं। चेतावनी के लिए धन्यवाद। – mmdemirbas

+1

मुझे पता है कि थ्रेड लंबे समय से मर चुका है, लेकिन मैं बेहतर प्रदर्शन के लिए 'प्रतिस्थापन (स्ट्रिंग, स्ट्रिंग)' प्रतिस्थापन (char, char) 'के साथ बदल दूंगा ..... – Unknown6656

0

अनुमति स्वरूपों निर्दिष्ट करने के लिए उपयोग double.TryParse के इस अधिभार:

Double.TryParse Method (String, NumberStyles, IFormatProvider, Double%)

डिफ़ॉल्ट रूप से, double.TryParse वर्तमान संस्कृति विशिष्ट प्रारूप के आधार पर पार्स जाएगा।

12

समस्या यह है कि आप (या सिस्टम) हजारों विभाजक से दशमलव विभाजक को अलग नहीं कर सकते हैं जब वे दोनों कॉमा या डॉट हो सकते हैं। उदाहरण के लिए:

मेरी संस्कृति में,

1.123 1000 के ऊपर एक संख्या के लिए एक सामान्य अंकन है; जबकि

1,123 एक दशमलव विभाजक के रूप डॉट का उपयोग करने के अपरिवर्तनीय संस्कृति चूक का प्रयोग निकट 1.

एक संख्या है। आम तौर पर आपको यह सुनिश्चित करना चाहिए कि सभी संख्याएं सभी प्रणालियों (जैसे परिवर्तनीय संस्कृति) पर एक ही निरंतर संस्कृति का उपयोग करके लिखी जाएंगी।

यदि आप सुनिश्चित हैं कि आपकी संख्या में दशमलव विभाजक (यानी कोई हजार विभाजक नहीं) के लिए अल्पविराम या डॉट के अलावा कुछ भी शामिल नहीं है, तो मैं String.Replace() को एक बिंदु के साथ अल्पविराम और बाकी के रूप में करता हूं।

अन्यथा, आपको कुछ समय प्रोग्रामिंग करने में कठिनाई होगी जो संस्कृति को जानने के बिना 1,123 से 1.123 को अलग कर सकता है।

+0

सहमत, मेरे लिए यह सबसे तार्किक समाधान है। आप यह भी जांच सकते हैं कि तारों में "," या "।" लेकिन इनमें से एक समाधान ठीक इमो होना चाहिए। – eandersson

0

आप देख सकते हैं स्ट्रिंग

string s="";

 if (s.Contains(',')) 
     { 
     //treat as double how you wish 
     } 

का उपयोग कर एक दशमलव बिंदु शामिल हैं और उसके बाद का इलाज है कि एक दशमलव के रूप में, नहीं तो सिर्फ गैर डबल मूल्य साथ भेज देते हैं।

79

साथ

if (double.TryParse(values[i, j], out tmp)) 

की जगह दोनों का इलाज करने के लिए, और। दशमलव बिंदु के रूप में आपको न केवल दूसरे के साथ प्रतिस्थापित करना चाहिए, बल्कि यह भी सुनिश्चित करना चाहिए कि संस्कृति का उपयोग पार्सिंग इसे दशमलव बिंदु के रूप में व्याख्या करता है।

text = text.Replace(',', '.'); 
return double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out value); 
+0

धन्यवाद यह मेरे लिए काम किया। –

+0

मेरे लिए काम किया। बस मैं चाहता था चाहता हूँ। – radbyx

+0

बेस्ट जवाब! साफ और esay। –

18

आप अल्पविराम और डॉट को बदलने की जरूरत नहीं है ..

मुझे एक ही समस्या है। कारण सरल है, रूपांतरण संस्कृति एक बड़ी भूमिका निभाती है जिसमें अल्पविराम या डॉट का अर्थ होता है। मैं एक जर्मन संस्कृति का उपयोग करता हूं जहां अल्पविराम भिन्नता को अलग करता है, जहां कहीं और डॉट नौकरी करता है।

यहां मैंने अंतर को स्पष्ट करने के लिए एक पूर्ण उदाहरण बनाया है।

string[] doubleStrings = {"hello", "0.123", "0,123"}; 
     double localCultreResult; 
     foreach (var doubleString in doubleStrings) 
     { 
      double.TryParse(doubleString, NumberStyles.Any, CultureInfo.CurrentCulture, out localCultreResult); 
      Console.WriteLine(string.Format("Local culture results for the parsing of {0} is {1}",doubleString,localCultreResult)); 

     } 


     double invariantCultureResult; 
     foreach (var doubleString in doubleStrings) 
     { 
      double.TryParse(doubleString, NumberStyles.Any, CultureInfo.InvariantCulture, out invariantCultureResult); 
      Console.WriteLine(string.Format("Invariant culture results for the parsing of {0} is {1}", doubleString, invariantCultureResult)); 

     } 

परिणाम जहां निम्नलिखित enter image description here

संस्कृति के साथ खेलते हैं चारों ओर और आप परिणाम आप की जरूरत मिल जाएगा।

+0

मैंने विभिन्न संस्कृति सेटिंग्स के साथ कुछ पीसी पर इस समाधान की कोशिश की। यह उम्मीद के रूप में काम नहीं करता है। मैं बाद में एक और समाधान पोस्ट करूंगा। – Andrew

+0

मैंने कोशिश की लेकिन यह मेरे लिए काम नहीं करता है। कृपया लिंक में छवि देखें। CurrentCulture पैरामीटर जर्मन है। https://imgur.com/QvtPt7S – batmaci

0

इसे आजमाएं ... यह मेरे लिए काम करता है।

double vdouble = 0; 
string sparam = "2,1"; 

if (!Double.TryParse(sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble)) 
{ 
    if (sparam.IndexOf('.') != -1) 
    { 
     sparam = sparam.Replace('.', ','); 
    } 
    else 
    { 
     sparam = sparam.Replace(',', '.'); 
    } 

    if (!Double.TryParse(sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble)) 
    { 
     vdouble = 0; 
    } 
} 
+3

शायद आप जो कुछ कर रहे हैं उसे समझा सकते हैं। "मेरे लिए काम करता है" बहुत वर्णनात्मक नहीं है। – firelynx

0

स्ट्रिंग से दशमलव संख्या का विश्लेषण करने के लिए एक्सटेंशन।

  • किसी भी मामले की संख्या शुरुआत में, अंत में या स्ट्रिंग के बीच में कोई भी मामला नहीं होगा।
  • कोई फर्क नहीं पड़ता कि केवल संख्या या "कचरा" पत्र होंगे।
  • कोई फर्क नहीं पड़ता कि पीसी पर सांस्कृतिक सेटिंग्स में डिलीमीटर क्या कॉन्फ़िगर किया गया है: यह सही ढंग से डॉट और कॉमा को पार्स करेगा।
  • मैन्युअल रूप से दशमलव प्रतीक सेट करने की क्षमता।

    public static class StringExtension 
    { 
        public static double DoubleParseAdvanced(this string strToParse, char decimalSymbol = ',') 
        { 
         string tmp = Regex.Match(strToParse, @"([-]?[0-9]+)([\s])?([0-9]+)?[." + decimalSymbol + "]?([0-9 ]+)?([0-9]+)?").Value; 
    
         if (tmp.Length > 0 && strToParse.Contains(tmp)) 
         { 
          var currDecSeparator = System.Windows.Forms.Application.CurrentCulture.NumberFormat.NumberDecimalSeparator; 
    
          tmp = tmp.Replace(".", currDecSeparator).Replace(decimalSymbol.ToString(), currDecSeparator); 
    
          return double.Parse(tmp); 
         } 
    
         return 0; 
        } 
    } 
    

उपयोग कैसे करें:

"It's 4.45 O'clock now".DoubleParseAdvanced(); // will return 4.45 
"It's 4,45 O'clock now".DoubleParseAdvanced(); // will return 4.45 
"It's 4:45 O'clock now".DoubleParseAdvanced(':'); // will return 4.45 
+0

4:45 4.75: पी के बराबर होना चाहिए – Logman

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