web-dev-qa-db-fra.com

Pourquoi Android Lint avertit-il que String.format utilise les paramètres régionaux par défaut lorsqu’il utilise explicitement Locale.US?

J'ai initialement appelé String.format de cette façon:

return String.format("%s %f %f", anotherString, doubleA, doubleB);

Qui a fait Android Lint générer cet avertissement:

Implicitement, utiliser les paramètres régionaux par défaut est une source commune de bogues: utilisez String.format (Locale, ...) à la place.

Je l'ai donc modifiée pour utiliser Locale.US explicitement, en fonction de ce que j'ai lu sur http://developer.Android.com/reference/Java/util/Locale.html dans la section "Attention aux paramètres régionaux par défaut":

return String.format(Locale.US, "%s %f %f", anotherString, doubleA, doubleB);

Pourquoi Android Lint génère-t-il toujours le même avertissement? Je dois nettoyer le projet dans Eclipse pour m'en débarrasser, lorsque la plupart des avertissements disparaîtront dès que la ligne incriminée sera corrigée. Je ne sais pas si je fais quelque chose de mal ou pas.

45
Evan

Le nettoyage et la reconstruction du projet devraient fonctionner.

En passant, vous pouvez utiliser Locale.getDefault() pour "prendre soin de" les textes non écrits en anglais. 

47

Paramètres régionaux implicites par défaut en cas de conversion

L'appel de String#toLowerCase() ou #toUpperCase() sans spécifier de paramètres régionaux explicites est une source commune de bogues. La raison en est que ces méthodes utiliseront les paramètres régionaux en cours sur le périphérique de l'utilisateur et bien que le code semble fonctionner correctement lors du développement de l'application, il échouera dans certains paramètres régionaux. Par exemple, dans l'environnement local turc, le remplacement majuscule de i n'est pas I.

Si vous voulez que les méthodes ne fassent que remplacer ASCII, par exemple pour convertir un nom enum, appelez plutôt String#toUpperCase(Locale.US). Si vous voulez vraiment utiliser les paramètres régionaux en vigueur, appelez plutôt String#toUpperCase(Locale.getDefault()).

http://developer.Android.com/reference/Java/util/Locale.html#default_locale

5
Paulo Mendonça

Vous pouvez désactiver cet avertissement pour l'ensemble de l'application, mettez le code ci-dessous dans votre gradle (Module: app)

 Android {
    ...
    lintOptions {
            disable 'DefaultLocale'
        }
    ...
    }
0
GianhTran