2008-10-15 18 views
5

में नंबरडिसीमलसेपरेटर का पता कैसे लगा सकता हूं, मैं यह देखने की कोशिश कर रहा हूं कि उपयोगकर्ता ने टेक्स्ट बॉक्स में दशमलव विभाजक दबाया है या फिर अन्य पैरामीटर के आधार पर इसे अनुमति या दबाएं।मैं किसी कुंजीडाउन ईवेंट (सी #)

नंबरडिसीमलसेपरेटर 46, या '।' के रूप में लौटाता है। मेरे यूएस सिस्टम पर। कई अन्य देश विभाजक के रूप में ',' का उपयोग करते हैं। जब मैं अवधि दबाता हूं तो KeyDown ईवेंट KeyValue को 190 पर सेट करता है।

क्या मैं अभी अल्पविराम/अवधि की तलाश करना जारी रखता हूं, या क्या कोई बेहतर तरीका है?

उत्तर

9

कॉल

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator 

वर्तमान यूजर इंटरफेस संस्कृति के लिए दशमलव विभाजक हो जाता है। आप अन्य भाषाओं के लिए विभाजक प्राप्त करने के लिए अन्य संस्कृतियों का उपयोग कर सकते हैं।


संपादित

166 संस्कृतियों है कि मेरे प्रणाली ( CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()) में रिपोर्ट कर रहे हैं से

, ऐसा लगता है कि केवल दो विभाजक उपयोग किया जाता है: अवधि और अल्पविराम। आप अपने सिस्टम में यह कोशिश कर सकते हैं: यह मानते हुए कि यह सच है

var seps = CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
      .Select(ci => ci.NumberFormat.NumberDecimalSeparator) 
      .Distinct() 
      .ToList(); 

, इस विधि सहायक हो सकता है (ध्यान दें कि keyCode अवैध संयोजनों को खत्म करने के modifiers ध्वज के साथ OR'ed है):

private bool IsDecimalSeparator(Keys keyCode, Keys modifiers) 
    { 
     Keys fullKeyCode = keyCode | modifiers; 
     if (fullKeyCode.Equals(Keys.Decimal))   // value=110 
      return true; 

     string uiSep = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator; 
     if (uiSep.Equals(".")) 
      return fullKeyCode.Equals(Keys.OemPeriod); // value=190 
     else if (uiSep.Equals(",")) 
      return fullKeyCode.Equals(Keys.Oemcomma); // value=188 
     throw new ApplicationException(string.Format("Unknown separator found {0}", uiSep)); 
    } 

एक अंतिम नोट: Keys enumeration के अनुसार, मूल्य 46 जो आप उल्लेख करते हैं वह DEL (हटाएं) कुंजी से मेल खाता है (यानी जब बिंदु लॉक बंद हो जाता है)।

+1

यह विचार करते समय प्रश्न का उत्तर नहीं देता है: "नंबरडिसीमलसेपरेटर 46, या 'के रूप में लौटाता है। मेरे यूएस सिस्टम पर। कई अन्य देश विभाजक के रूप में ',' का उपयोग करते हैं। जब मैं अवधि दबाता हूं तो कीडाउन घटना 1 9 0 तक कीवैल्यू सेट करती है। " ... जैसा कि प्रश्न में लिखा गया है। –

0

समस्या यह है कि KeyEventArgs में मान मुख्य कोड हैं, वर्ण नहीं। यदि आप इसके बजाय KeyPress संभालते हैं, तो आपको KeyPressEventArgs में एक char मिलेगा जिसका उपयोग आप तुलना के लिए कर सकते हैं।

नोट: आपको वास्तव में NumberDecimalSeparator वर्णों की तुलना करना चाहिए क्योंकि यह एक स्ट्रिंग है, एक वर्ण नहीं है, इसलिए आपको उन परिदृश्यों पर विचार करने की आवश्यकता है जहां स्ट्रिंग में एक से अधिक वर्ण हैं।

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