web-dev-qa-db-fra.com

Conversion de chaîne en nombre en Java

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:

  • String -> Number
  • "23423" -> 23423
  • "34.3" -> 34.3
  • "45364573747546" -> 45364573747546
4
Lakshan Prabhu

Utilisez NumberFormat. Le nombre ne peut pas être instancié car il s'agit d'une classe abstraite.

 Number number = NumberFormat.getInstance().parse(string);
5
minigeek

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();
  }
}
1
Olivier Grégoire

Deux cas:

  1. Si votre chaîne est inférieure à 8 octets:

double primitiveNumber = Double.parseDouble(input);

  1. Si votre chaîne d'entrée est supérieure à 8 octets: vous ne pouvez de toute façon pas la stocker dans une primitive. Vous pouvez alors utiliser la classe Number, mais cela ne risque pas de se produire car vous attendez une primitive.
1
Sandeep

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 );    
}
0
Varejones

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
}
0
Arsen Alexanyan

Double.valueOf() fera l'affaire sauf si vous avez un nombre très long.

0
sssemil

Je préfère BigDecimal seulement. Parce qu'il n'aura pas les problèmes de taille et de précision

0
ravip

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.

0
Code-Apprentice

Pour les entiers:

int myInteger = Integer.parseInt("23423");

Pour les doubles:

double myDouble = Double.parseDouble("34.3");
0
Noureddine Ouertani