Подтвердить что ты не робот

ToUpperCaseLocale() vs toUpperCase() - теперь для Android 4.2

Поскольку я нацелен на новую версию SDK для Android, я получаю предупреждение в этой строке кода:

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

Когда я навис над ним, он говорит:

Неявно использование стандарта по умолчанию является общим источником ошибок: вместо этого используйте toUpperCase(Locale).

Кто-нибудь знает, как удалить эту ошибку? И почему теперь это предпочтительный способ использования этого метода?

Я получаю это ответ, чтобы использовать toUpperCase(Locale), но не удалось его реализовать. Откуда возникает объект Locale?

4b9b3361

Ответ 1

Вы можете явно использовать локаль по умолчанию:

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

В принципе, вы не хотите, чтобы явным образом позволял устройству использовать значение по умолчанию, потому что это может означать, что вы просто игнорируете тот факт, что это может быть проблемой. Для машиночитаемого контента вы можете указать конкретную локаль (например, Locale.ENGLISH), чтобы вы всегда получали возможность повторного использования из данных. Чтобы показать пользователя, явно указать локаль по умолчанию, должно быть хорошо.

Для более полного чтения:

Общей ошибкой является неявное использование стандартного языка при выпуске, предназначенном для машинного чтения. Это, как правило, работает на тестовых устройствах разработчиков (особенно потому, что многие разработчики используют en_US), но не работает при запуске на устройстве, пользователь которого находится в более сложной локали.

Например, если вы форматируете целые числа, некоторые локали будут использовать десятичные числа без ASCII. В качестве другого примера, если вы форматируете числа с плавающей запятой, некоторые локали будут использовать ',' в качестве десятичной точки и '.' для группировки цифр. Это правильно для чтения человеком, но может вызвать проблемы, если они представлены на другом компьютере (parseDouble(String) не может разобрать такой номер, например). Вы также должны опасаться перегрузок toLowerCase() и toUpperCase(), которые не принимают локаль: в Турции, например, символы 'i' и 'i' не будут преобразованы в 'i' и 'i'. Это правильное поведение для турецкого текста (например, ввод пользователя), но неприемлемо для, скажем, HTTP-заголовков.

- Locale документация разработчика