Remove digits from a number in Java [closed]

2019-02-21 18:58发布

问题:

How do I remove the first digit of an integer?

My input is an integer (for example i = 123456789).

I then want to remove the first digit, so that i equals 23456789.

回答1:

try this

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


回答2:

Here is one way to do it:

  • Convert it to String
  • Take the substring without the first "digit"
  • Convert it to 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);
}

Output:

23456789

Note: This can be done in one line with

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

Edit:

To handle negative-case, check if number is positive or integer:

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


回答3:

If you want to avoid the string conversion, you can find the high digit and subtract it.

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


回答4:

Here's the one-line, purely numeric solution:

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


回答5:

Alternate approach:

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;
  }
}


回答6:

I think I remember the string-free version of this … although I totally agree with @Christian as how I would do it…

NOTE: as @Darren Gilroy pointed out, one must consider negatives and zero spocially, and my function fails to do so.

Of course % is a better solution also.

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

Poor profiling attempt:

Looping the above function without the println for 20,000,000,000 repeats in a for loop:

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

The same with Christian's far-easier-to-understand and perfectly functionable version, but for only 200,000,000 repeats (because I'm lazy and got tired of waiting):

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

So one might argue that constructing the String objects is probably slowing it down by roughly 200×, but that isn't a really finely-tuned profiling set-up.



回答7:

If you want to go for simpler methods and without using String, then here's my simple take:

  1. Count number of digits int the integer.
  2. Divide the int by 10^n. n is the number of digits.
  3. Obtain absolute value of the result. //In case of (-)ve numbers.

For example

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

And you'd require this method:

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