web-dev-qa-db-fra.com

Supprimer des chiffres d'un numéro en Java

Comment puis-je supprimer le premier chiffre d'un entier?

Mon entrée est un entier (par exemple i = 123456789).

Je veux ensuite supprimer le premier chiffre, de sorte que je égal 23456789.

8
user3159331

Voici une façon de le faire:

  • Convertissez-le en String
  • Prendre la sous-chaîne sans le premier "chiffre"
  • Convertissez-le en int

Code:

public static void main(String[] args)
{
    int x = 123456789;

    String x_str = Integer.toString(x);

    int new_x = Integer.parseInt(x_str.substring(1));

    System.out.println(new_x);
}

Sortie:

23456789

Remarque: Ceci peut être effectué sur une seule ligne avec

int x = 123456789;
int new_x = Integer.parseInt(Integer.toString(x).substring(1));

Modifier:

Pour gérer les cas négatifs, vérifiez si nombre est positif ou entier:

int new_x = Integer.parseInt(x > 0 ? 
    Integer.toString(x).substring(1) : Integer.toString(x).substring(2));
11
Christian

essaye ça

n = n % (int) Math.pow(10, (int) Math.log10(n));
11
Evgeniy Dorofeev

Si vous voulez éviter la conversion de chaîne, vous pouvez trouver le chiffre le plus élevé et le soustraire.

public static void main(String[] args) {
    int x = 123456789;
    System.out.println("x = " + x);
    int hi = x, n = 0;
    while (hi > 9) {
        hi /= 10;
        ++n;
    }
    for (int i = 0; i < n; i++) hi *= 10;
    x -= hi;
    System.out.println("x with high digit removed = " + x);
}
2
Gene

Approche alternative:

int stripLeading(int i) {
  if(i > 0) {
    return i - (int)Math.pow(10, (int)Math.log10(i));
  } else if(i > 0) {
    return i + (int)Math.pow(10, (int)Math.log(-i+1));
  } else {
    return 0;
  }
}
1
Darren Gilroy

Je pense me souvenir de la version sans cordes de cette… bien que je sois totalement d'accord avec @Christian quant à la façon dont je le ferais…

NOTE: comme @Darren Gilroy l'a souligné, il faut considérer les négatifs et les zéros spocialement, ce que ma fonction ne permet pas de faire.

Bien sûr, % est une meilleure solution également.

public static void main (String [] argv)
{
     final int x = 123456789;
     int newX = x;

     /* How many digits are there? */
     final double originalLog = Math.floor (Math.log10 (x));

     /* Let's subtract 10 to that power until the number is smaller */
     final int getRidOf = (int)Math.pow (10, originalLog);
     while (originalLog == Math.floor (Math.log10 (newX)))
     { newX -= getRidOf; }

     System.out.println (newX);
}

Mauvaise tentative de profilage:

Boucler la fonction ci-dessus sans la println pour 20 000 000 000 répétitions dans une boucle for:

real    0m9.943s
user    0m9.890s
sys     0m0.028s

De même avec la version beaucoup plus facile à comprendre et parfaitement fonctionnelle de Christian, mais pour seulement 200 000 000 de répétitions (parce que je suis paresseux et fatigué d'attendre):

real    0m18.581s
user    0m17.972s
sys     0m0.574s

On pourrait donc soutenir que la construction des objets String le ralentit probablement d'environ 200 ×, mais il ne s'agit pas d'une configuration de profilage vraiment précise.

1
BRPocock

Voici la solution purement numérique en une ligne:

i %= (int) Math.pow(10, (int) Math.log10(i));
1
Bohemian

Si vous souhaitez utiliser des méthodes plus simples sans utiliser String, voici ma conclusion simple:

  1. Compter le nombre de chiffres dans l'entier.
  2. Divisez la int par 10^n. n est le nombre de chiffres.
  3. Obtenir la valeur absolue du résultat. // En cas de (-) cinq chiffres.

Par exemple

int i = 123456789;
int n = getDigitCount(i);
int r = Math.abs(i / (int)Math.pow(10,n)); //r stores result.

Et vous auriez besoin de cette méthode:

int getDigitCount(int num)
{
    int c = 0;
    while(num > 0){
        num/=10;
        c++;
    }
    return c;
}
0
Hungry Blue Dev