Comment puis-je convertir une chaîne en un nombre abstrait, à condition que chaîne soit un nombre valide en Java (par exemple, int, long, double, etc.).
Je ne saurai pas le type de nombre dans la chaîne, je ne peux donc pas utiliser d'analyse primitive spécifique (comme Integer.parseInt, Long.parseLong, etc.). Existe-t-il un moyen générique de le convertir?
Par exemple:
Utilisez NumberFormat. Le nombre ne peut pas être instancié car il s'agit d'une classe abstraite.
Number number = NumberFormat.getInstance().parse(string);
Double
fera perdre de la précision à votre valeur si elle est trop longue.
Vous devriez utiliser un BigDecimal
à la place:
BigDecimal number = new BigDecimal("43.256");
Vous pouvez alors obtenir différentes primitives comme ceci:
try {
int intValue = number.intValueExact();
} catch (ArithmeticException e) {
try {
long longValue = number.longValueExact();
} catch (ArithmeticException e) {
double doubleValue = number.doubleValue();
}
}
Deux cas:
double primitiveNumber = Double.parseDouble(input);
Vous pouvez utiliser Double.parseDouble () pour convertir votre chaîne en double. Cela fonctionnera même si la chaîne est un entier:
String myString = "1234.56";
double myDouble = Double.parseDouble(myString);
Si vous devez vérifier s'il s'agit d'un entier ou d'un double:
String myString = "1234.56";
int myInt;
double myDouble = Double.parseDouble(myString);
if ((myDouble % 1) == 0) {
myInt = (int) myDouble;
System.out.println("myString is an integer: " + myInt );
} else {
System.out.println("myString is a double: " + myDouble );
}
Ou vous pouvez utiliser GoyaveDoubleMath.isMathematicalInteger () :
String myString = "1234.56";
int myInt;
double myDouble = Double.parseDouble(myString);
if (DoubleMath.isMathematicalInteger(myDouble)) {
myInt = (int) myDouble;
System.out.println("myString is an integer: " + myInt );
} else {
System.out.println("myString is a double: " + myDouble );
}
Tant que vos chaînes peuvent être de grands nombres (supposons que non plus que primitive long et double), alors la manière générique pourrait être de décider si elle est longue ou double.
Number n = Double.valueOf(string);
if((double)n.intValue() == n.doubleValue()){
//n is double use n.doubleValue() or just use the n for generic purposes
}
else{
//n is int use n.intValue() or just use the n for generic purposes
}
Double.valueOf()
fera l'affaire sauf si vous avez un nombre très long.
Je préfère BigDecimal
seulement. Parce qu'il n'aura pas les problèmes de taille et de précision
Le moyen le plus rapide de faire est simplement de toujours utiliser Double.parseDouble()
. Si vous avez besoin d'un analyseur syntaxique à usage général qui détermine quelle primitive utiliser, plutôt que d'utiliser toujours le même type, vous devrez alors écrire le vôtre. Une façon de procéder consiste à utiliser chaque méthode parseXxx()
et chaque lot d'instructions try...catch
.
Pour les entiers:
int myInteger = Integer.parseInt("23423");
Pour les doubles:
double myDouble = Double.parseDouble("34.3");