NumberFormat.parse() échoue pour certains des chaînes de devise

J'ai un simple EditText, qui permet à l'utilisateur d'entrer un nombre tel que 45.60 (exemple pour le Dollar Américain). J'ai ensuite formater ce nombre à l'aide de la méthode suivante:

public String format() {
    NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.getDefault());
    return formatter.format(amount.doubleValue());
}

Et sur mon téléphone Android, la langue est l'anglais (États-unis) - d'où le Locale.getDefault() doit renvoyer le NOUS locale (et il le fait).

Maintenant l'édition de texte est correctement mis à jour à: $45.60 (d'où le formatage du numéro entré œuvres).

Cependant, si je tente d'analyser la au-dessus de la Chaîne de "$45.60" à l'aide de la méthode suivante:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault());
Number result = numberFormat.parse("$45.60");

Il échoue avec:

java.lang.IllegalArgumentException: Failed to parse amount $45.60 using locale en_US.

Si j'ai mis mon téléphone en anglais/royaume-UNI, la mise en forme de cette "45.60" à "£45.60" fonctionne correctement (comme pour NOUS), cependant l'analyse "£45.60" échoue, comme il le fait pour le dessus de l'échantillon.

Cependant, si j'ai mis mon téléphone à l'allemand (Allemagne), la mise en forme "45,60" à "45,60€" fonctionne correctement, ET l'analyse "45,60€" fonctionne correctement!

La seule différence que je vois entre ces trois devises: L'Euro est ajouté à la quantité, tandis que le Dollar et la Livre sterling sont ajoutés au montant.

Quelqu'un a une idée, pourquoi le même code fonctionne pour l'Euro, mais pas pour la Livre et le Dollar? Ai-je raté quelque chose?

J'ai également créé une unité de test, pour reproduire le problème:

public void testCreateStringBased() throws Exception {

    //For German locale
    CurrencyAmount amount = new CurrencyAmount("25,46€", Locale.GERMANY);
    assertEquals(25.46, amount.getAsDouble());

    //For French locale
    amount = new CurrencyAmount("25,46€", Locale.FRANCE);
    assertEquals(25.46, amount.getAsDouble());

    //For US locale
    amount = new CurrencyAmount("$25.46", Locale.US);
    assertEquals(25.46, amount.getAsDouble());

    //For UK locale
    amount = new CurrencyAmount("£25.46", Locale.UK);
    assertEquals(25.46, amount.getAsDouble());
}

CurrencyAmount fondamentalement encapsule le code que j'ai posté pour l'analyse des chaînes de devise, sauf qu'il prend la donnée locale au lieu de la locale par défaut. Dans l'exemple ci-dessus, le test réussit pour l'ALLEMAGNE et la FRANCE locale, mais ne parvient pas pour NOUS et le royaume-UNI locale.

OriginalL'auteur AgentKnopf | 2013-03-23