'Python removing first 3 digits in a number

Hopefully a simple one, I have a number, say 1234567.890 this number could be anything but will be this length.

How do I truncate the first 3 numbers so it turns into 4567.890?

This could be any number so subtracting 123000 will not work.


I'm working with map data in UTM coordinates (but that should not matter)

Example

x = 580992.528
y = 4275267.719

For x, I want 992.528

For y, I want 267.719

Note: y has an extra digit to the left of the decimal so 4 need removing



Solution 1:[1]

You can use slices for this:

x = 1234567.890

# This is still a float
x = float(str(x)[3:])

print(x)

Outputs:

4567.89

As [3:] gets the starts the index at 3 and continues to the end of the string

Solution 2:[2]

Update after your edit

The simplest way is to use Decimal:

from decimal import Decimal

def fmod(v, m=1000, /):
    return float(Decimal(str(v)) % m)

print(fmod(x))
print(fmod(y))

Output

992.528
267.719

If you don't use string, you will have some problems with floating point in Python.

Demo:

n = 1234567.890
i = 0
while True:
    m = int(n // 10**i)
    if m < 1000:
        break
    i += 1
r = n % 10**i

Output:

>>> r
4567.889999999898

>>> round(r, 3)
4567.89

Same with Decimal from decimal module:

from decimal import Decimal

n = 1234567.890
n = Decimal(str(n))
i = 0
while True:
    m = int(n // 10**i)
    if m < 1000:
        break
    i += 1
r = n % 10**i

Output:

>>> r
Decimal('4567.89')

>>> float(r)
4567.89

Solution 3:[3]

This approach simply implements your idea.

  • int_len is the length of the integer part that we keep
  • sub is the rounded value that we will subtract the original float by

Code

Here is the code that implements your idea.

import math


def trim(n, digits):
    int_len = len(str(int(n))) - digits  # length of 4567
    sub = math.floor(n / 10 **int_len) * 10**int_len

    print(n - sub)

But as Kelly Bundy has pointed out, you can use modulo operation to avoid the complicated process of finding the subtrahend.

def trim(n, digits):
    int_len = len(str(int(n))) - digits  # length of 4567

    print(n % 10**int_len)

Output

The floating point thing is a bit cursed and you may want to take Corralien's answer as an alternative.

>>> n = 1234567.890

>>> trim(n, 3)
4567.889999999898

Solution 4:[4]

def get_slice(number, split_n):
  return number - (number // 10**split_n) * 10**split_n

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3
Solution 4 saganaga