8 votes

String.format ne parvient pas à formater les chiffres sur certains appareils ?

J'ai le code suivant :

int color = 0;
int number = 0;
// ...
s = String.format("%dproduct%d", color, number);

Cela fonctionne bien sur mon ordinateur et sur mon appareil Android. J'obtiens des chaînes de caractères comme 0product0 etc. MAIS en production, sur les appareils Android des utilisateurs, j'obtiens des chaînes comme :

٠product٠
٠product١
٠product٢
٠product٣
٠product٤

Est-ce que String.format() ne fonctionne pas correctement lorsque l'on commence par un nombre ?

4voto

Ralf Kleberhoff Points 3938

Les chaînes que vous obtenez sont "correctes" pour un Locale arabe, comme par exemple la valeur UTF-8 à deux octets d9 a0 (tel que posté par Andy) encode le point de code Unicode U+0660 étant le ARABIC-INDIC DIGIT ZERO .

Comme le reste de votre sortie n'est pas dépendant de la locale, vous voulez probablement que les chiffres soient affichés en US Locale également, comme proposé par Hitesh Sarsava :

String s = String.format(Locale.US, "%dproduct%d", color, number);

3voto

Andy Points 1155

La variable ici est le Locale par défaut qui peut être différent sur les appareils.

Pour vous aider à comprendre, voici la vue hexagonale de la sortie de la chaîne que vous avez postée :

d9 a0 70 72 6f 64 75 63 74 d9 a0  

qui s'affiche sur mon PC (UTF-8) comme :

٠product٠ 

Suivez donc les conseils donnés dans les autres réponses et continuez également à rechercher "Locale".

Pour être plus précis, il peut être utile de savoir dans quelle région les autres dispositifs ne fonctionnent pas.

C'est un problème intéressant.

Vous pouvez également essayer de recréer cette situation sur votre propre émulateur en utilisant l'application "Custom Locale" qui est préinstallée sur l'émulateur. Je ne peux pas dire avec certitude que la langue dont vous avez besoin est supportée.

En me basant sur les excellentes recherches de @RalfKleberhoff, j'ai pu recréer ce problème sur un émulateur en utilisant l'application préinstallée 'Custom Locale' et en la remplaçant par la locale 'ar' (la première de la liste). (Principalement pour ma propre éducation - mais peut être utile pour vous aussi).

Ce qui est encore plus éclairant ( ?) c'est si vous avez programmé quelque chose comme :

String.format("0product0")

c'est-à-dire pas de formatage - cela fonctionne dans la locale 'ar' comme dans l'affichage des chiffres 'en', donc il semble que le problème soit limité à l'aspect formatage ("%...") de cette fonction - clair comme de l'eau de roche.

2voto

Hitesh Sarsava Points 514

Utilisez un format comme celui-ci :

String s = String.format(Locale.getDefault(), "%dproduct%d", color, number);

ou utiliser selon vos besoins comme ceci :

String s = String.format(Locale.US, "%dproduct%d", color, number);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X