2012-11-23 11 views
19

को निशाना बनाने के बाद से मैं Android के नए SDK संस्करण लक्षित, मैं कोड की इस पंक्ति पर एक चेतावनी हो रही किया गया है:toUpperCaseLocale() बनाम toUpperCase() - अब Android 4.2

return getString(R.string.usertab1).toUpperCase() 

जब मैं उस पर होवर करें, यह कहता है:

डिफ़ॉल्ट रूप से डिफ़ॉल्ट लोकेल का उपयोग करना बग का एक आम स्रोत है: इसके बजाय toUpperCase(Locale) का उपयोग करें।

क्या कोई इस त्रुटि को हटाने के बारे में जानता है? और अब यह विधि का उपयोग करने का पसंदीदा तरीका क्यों है?

मुझे यह जवाब है, toUpperCase(Locale) का उपयोग करने के लिए, लेकिन इसे लागू करने में समस्या आ रही है। Locale ऑब्जेक्ट कहां से आता है?

उत्तर

32

आप स्पष्ट डिफ़ॉल्ट स्थान इस्तेमाल कर सकते हैं:

return getString(R.string.usertab1).toUpperCase(Locale.getDefault()); 

मूल रूप से, आप नहीं करना चाहती परोक्ष डिवाइस, डिफ़ॉल्ट उपयोग करने के लिए है क्योंकि यह मतलब हो सकता है तो आप बस तथ्य यह है कि ध्यान नहीं दिया की अनुमति देते हैं यह एक मुद्दा हो सकता है। मशीन-पठनीय सामग्री के लिए, आप यह सुनिश्चित करने के लिए एक विशिष्ट लोकेल (जैसे Locale.ENGLISH) निर्दिष्ट करना चाह सकते हैं ताकि आप हमेशा डेटा से बाहर निकलने वाली पुन: प्रयोज्यता प्राप्त कर सकें। उपयोगकर्ता को दिखाने के लिए, डिफ़ॉल्ट लोकेल को स्पष्ट रूप से निर्दिष्ट करना ठीक होना चाहिए।

एक और अधिक पूरा पढ़ने के लिए:

एक आम गलती जब मशीन पठनीय होना उत्पादन उत्पादन परोक्ष डिफ़ॉल्ट स्थान का प्रयोग है। यह डेवलपर के परीक्षण उपकरणों पर काम करता है (विशेष रूप से क्योंकि बहुत से डेवलपर्स en_US का उपयोग करते हैं), लेकिन डिवाइस पर चलने में असफल रहता है जिसका उपयोगकर्ता अधिक जटिल लोकेल में है।

उदाहरण के लिए, यदि आप पूर्णांक स्वरूपण कर रहे हैं तो कुछ लोकल गैर-ASCII दशमलव अंकों का उपयोग करेंगे। एक और उदाहरण के रूप में, यदि आप फ़्लोटिंग-पॉइंट नंबर स्वरूपित कर रहे हैं तो कुछ स्थानीय अंक ',' को दशमलव बिंदु के लिए दशमलव बिंदु और '.' के रूप में उपयोग करेंगे। यह मानव-पठनीय आउटपुट के लिए सही है, लेकिन यदि किसी अन्य कंप्यूटर को प्रस्तुत किया गया है तो समस्याएं उत्पन्न होने की संभावना है (parseDouble(String) उदाहरण के लिए, इस तरह की संख्या का विश्लेषण नहीं कर सकता है)। आपको और toUpperCase() अधिभार से सावधान रहना चाहिए जो लोकेल नहीं लेते: तुर्की में, उदाहरण के लिए, वर्ण 'i' और 'I''I' और 'i' में परिवर्तित नहीं किए जाएंगे। तुर्की पाठ (जैसे उपयोगकर्ता इनपुट) के लिए यह सही व्यवहार है, लेकिन HTTP हेडर कहने के लिए अनुचित है।

- Locale developer documentation

+1

एक बेहतर जगह इसे पाने के लिए विन्यास वस्तु है, जो आप 'getResources उपयोग कर किसी भी' Context' से प्राप्त कर सकते से है() getConfiguration() ': http: // डेवलपर।। android.com/reference/android/content/res/Configuration.html#locale – adamp

+0

मुझे एक ही समस्या है। मेरे पात्र तुर्की हैं लेकिन मुझे ऐसा कुछ नहीं दिख रहा था "लोकेल। तुर्की" मैं इसे कैसे संभाल सकता हूं? –

+1

@ गुना ग्ल्टेकिन आप 'नया लोकेल ("tr_TR")' का उपयोग कर सकते हैं: [** नमूना के लिए यहां क्लिक करें **] (http://ideone.com/IavMuX) – Eric

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