2015-07-13 2 views
0

Quand je lance cette ligne de code: Float.parseFloat (« 1460000 JPY ») je reçois l'erreurJava parseFloat exception avec une chaîne qui est le numéro suivi de caractères

Exception dans le thread « principal » java.lang. NumberFormatException: pour la chaîne d'entrée: "1460000 JPY"

Cette chaîne provient d'un appel d'API à partir d'un formulaire où il s'agit d'un champ de texte sans validation. Cela fonctionne généralement parce que les gens ne mettent qu'un nombre, mais parfois vous obtenez ce problème. Comment est-ce que je l'obtient pour renvoyer seulement les nombres initiaux comme un flotteur et ne pas tenir compte des caractères d'alpha de fin?

+4

Vous devez d'abord retirer les lettres, puis analyser ce qui reste à un flotteur. – azurefrog

Répondre

2

MISE À JOUR: pour tenir compte du bug qui a soulevé @ Tom:

Float.parseFloat("1.46 JPY".replaceAll("[^0-9.]","")); 

1.46

ci-dessus est une solution supérieure. Voir ci-dessous pour des explications.

Comme @azurefrog dit, les caractères non décapage numériques et l'analyse de ce qui reste comme Float est la voie à go.You peut accomplir cela en utilisant le code suivant:

Float.parseFloat("1460000 JPY".replaceAll("[^0-9]","")); 

1460000.0

Ce n'est pas très robuste cependant, parce que pour les entrées comme "1.46" la sortie devient

146.0

.replaceAll("[^0-9.]","") corrige cette inexactitude en ajoutant le caractère . décimal à l'exclusion regex comme si [^0-9.]

+0

Supprimer le séparateur décimal n'est pas vraiment intelligent. – Tom

+0

Je suis désolé mais je ne suis pas sûr de comprendre ce que vous voulez dire. Êtes-vous en train de dire que 'Float.parseFloat (" 1460000.0 ".replaceAll (" [^ 0-9] "," "));' aboutirait à '14600000.0'? –

+0

essayez votre code avec '" 1.46 JPY "'. – Tom

3

Vous pouvez utiliser regex pour trouver si cette chaîne ne contient que chiffres ou non

String apistring = "1460000 JPY"; 
if(apistring.matches("[0-9]+")){ 
// do your code 
}else{ 
// throw some error message 
} 

Le décapage de ce caractère sera difficile car vous avez dit qu'il s'agit d'un champ de saisie et que l'utilisateur peut entrer n'importe quel texte. Vous pouvez le supprimer seulement si vous savez qu'il y a un modèle particulier

2

Puisque DecimalFormat est très indulgente au sujet de l'analyse des cordes, je le recommanderais.

Vous pouvez l'utiliser comme ceci:

DecimalFormat df = new DecimalFormat(); 
try { 
    float parsedValue = df.parse("1460000 JPY").floatValue(); 
    System.out.println(parsedValue); 
} catch (ParseException pe) { 
    pe.printStackTrace(); 
    // handle exception a bit more 
} 

Cette impression:

1460000.0

Comme vous pouvez le voir la méthode parse peut jeter un ParseException si la chaîne passée commence par quelque chose d'autre qu'un numéro, comme:

BLUB 1.460.000 JPY

Si ce won ne se passe pas dans votre application, alors vous n'avez pas à vous en préoccuper.

+0

en utilisant 'Float.parseFloat (" 1460000 JPY ".replaceAll (" [^ 0-9] "," "));' 'gère également les caractères précédents. –

+0

Et il fait de mauvaises choses avec des valeurs contenant un séparateur décimal, alors pourquoi pas "non"? :) – Tom

2

Vous pouvez utiliser regex pour extraire les nombres en entrée.

s = s.replaceAll("[^0-9]",""); 

puis d'y effectuer une analyse flottante. Le seul inconvénient est qu'il va extraire tous les nombres (il va extraire 1245 et 3 tous les deux de 1245 JPY 3).