2012-11-23 10 views
19

Odkąd ukierunkowane nowszą wersję SDK Androida, byłem coraz ostrzeżenie na tej linii kodu:toUpperCaseLocale() vs toUpperCase() - Teraz kierowania Android 4.2

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

Kiedy unoszą się nad nim, jest napisane:

Zamiast tego używa się domyślnie ustawień narodowych: Zamiast niego należy użyć toUpperCase(Locale).

Czy ktoś wie, jak usunąć ten błąd? I dlaczego jest to obecnie preferowany sposób korzystania z tej metody?

Otrzymuję tę odpowiedź, aby użyć toUpperCase(Locale), ale mam problem z jej implementacją. Skąd pochodzi obiekt Locale?

Odpowiedz

32

Można wyraźnie użyciu domyślnych ustawień regionalnych:

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

Zasadniczo, nie chcesz, aby niejawnie pozwalają urządzenie do korzystania z domyślnego, ponieważ może to oznaczać po prostu ignorować faktu, że to może być problem. W przypadku treści odczytywanych maszynowo możesz chcieć określić określone ustawienia narodowe (takie jak Locale.ENGLISH), aby zapewnić, że zawsze będziesz mógł korzystać z możliwości ponownego wykorzystania danych. Aby wyświetlić użytkownika, jawne określenie domyślnego ustawienia narodowego powinno być w porządku.

Dla pełniejszego przeczytane:

Częstym błędem jest niejawnie użyciu domyślnych ustawień regionalnych przy produkcji oznaczało wyjście do odczytu maszynowego. Ma to tendencję do pracy na testowych urządzeniach programisty (zwłaszcza dlatego, że tak wielu programistów używa en_US), ale nie działa, gdy działa na urządzeniu, którego użytkownik jest w bardziej złożonym języku.

Na przykład, jeśli formatujesz liczby całkowite, niektóre lokalizacje będą używać cyfr dziesiętnych innych niż ASCII. Jako inny przykład, jeśli formatujesz liczby zmiennoprzecinkowe, niektóre lokalizacje będą używać ',' jako punktu dziesiętnego i '.' do grupowania cyfr. Jest to poprawne dla odczytu czytelnego dla człowieka, ale może powodować problemy, jeśli zostanie przedstawione na innym komputerze (na przykład parseDouble(String) nie może zanalizować takiej liczby). Powinieneś także uważać na przeciążenia toLowerCase() i toUpperCase(), które nie uwzględniają ustawień regionalnych: w Turcji, na przykład znaki 'i' i 'I' nie zostaną przekonwertowane na 'I' i 'i'. Jest to poprawne zachowanie dla tekstu tureckiego (np. Dane wprowadzane przez użytkownika), ale nieodpowiednie dla, powiedzmy, nagłówków HTTP.

- Locale developer documentation

+1

Lepszym miejscem do tego jest od obiektu konfiguracji, które można uzyskać z dowolnego 'Context' użyciem' getResources() getConfiguration() ': http: // developer.. android.com/reference/android/content/res/Configuration.html#locale – adamp

+0

Mam ten sam problem. Moje postacie są tureckie, ale nie widziałem czegoś takiego jak "Locale.TURKISH" Jak mogę sobie z tym poradzić? –

+1

@ GünayGültekin Możesz użyć 'new Locale (" tr_TR ")': [** Kliknij tutaj, aby pobrać próbkę **] (http://ideone.com/IavMuX) – Eric

Powiązane problemy