2013-06-04 16 views
36

Originariamente ho chiamato String.format questo modo:Perché Android Lint avvisa su String.format utilizzando le impostazioni locali predefinite quando si utilizza esplicitamente Locale.US?

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

Quale fatto Android Lint generare questo avvertimento:

Implicitamente utilizzando le impostazioni locali di default è una fonte comune di bug: Usa String.Format (Locale,. ..) invece

quindi l'ho cambiato per usare Locale.US in modo esplicito, in base a quello che ho letto in http://developer.android.com/reference/java/util/Locale.html nella sezione "diffidare di impostazioni internazionali di default":

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

Perché Android Lint genera ancora lo stesso avviso? Devo pulire il progetto in Eclipse per sbarazzarlo, quando la maggior parte degli avvertimenti scompare appena viene fissata la riga incriminata. Non sono sicuro se sto facendo qualcosa di sbagliato o no.

+1

avvertimento Lint non è errore affatto. Sta solo cercando di parlarti di prestazioni, traduzione e problemi simili. Ricevo questo avviso anche nelle app che desidero scegliere come target solo in una determinata lingua, ma puoi sempre disabilitare la funzione di sfocatura andando a Finestra> Preferenze> Android> Verifica errori filaccia. Credo che nella peggiore situazione ci possa essere un dispositivo che non avrà Locale.US disponibile e quindi può causare alcuni problemi. Non ho affrontato nessuno di questi fino ad ora però. – Milan

risposta

35

La pulizia e la ricostruzione del progetto dovrebbero funzionare.

BTW, è possibile utilizzare Locale.getDefault() per "fare attenzione" ai testi non scritti in inglese.

+5

Sta in particolare cercando di evitare l'impostazione predefinita. – nitind

+1

Per quanto riguarda il punto in cui ho capito, tenta di evitarlo solo a causa della sezione "Diffida delle impostazioni locali predefinite" nella documentazione. Nonostante ciò, gli dico che potrebbe "volerlo usare", poiché in realtà dice che dovresti essere consapevole di utilizzare le impostazioni locali predefinite nella comunicazione macchina-macchina. –

+2

Uso sempre Locale.ROOT per questo caso. E la pulizia eliminerà l'avvertimento sui pelucchi, come ha affermato Alejandro. – suomi35

3

internazionale predefinita implicita in caso di conversione

Calling String#toLowerCase() o #toUpperCase() senza specificare un locale esplicita è una fonte comune di bug. Il motivo è che tali metodi utilizzeranno le impostazioni internazionali correnti sul dispositivo dell'utente e anche se il codice sembra funzionare correttamente durante lo sviluppo dell'applicazione, non funzionerà in alcune impostazioni internazionali. Ad esempio, nella lingua turca, la sostituzione in maiuscolo per I non è I.

Se si desidera che i metodi eseguano semplicemente la sostituzione ASCII, ad esempio per convertire un nome enum, chiamare invece String#toUpperCase(Locale.US). Se si desidera utilizzare le impostazioni internazionali correnti, chiamare invece String#toUpperCase(Locale.getDefault()).

http://developer.android.com/reference/java/util/Locale.html#default_locale

Problemi correlati