Skip to content
This repository was archived by the owner on Aug 6, 2021. It is now read-only.
This repository was archived by the owner on Aug 6, 2021. It is now read-only.

Add support for TRUNC #1

@strichter

Description

@strichter

Implementation:

def trunc(number, num_digits=0):
    """Truncate a number to the specified number of digits."""

    if isinstance(number, (int, float)):
        # Simple case. We want to make sure to return an integer in this
        # case.
        if num_digits == 0:
            return math.trunc(number)
        return math.trunc(number * 10**num_digits) / 10**num_digits
    else:
        return ExcelError(
            '#VALUE!', '{} must be a number. You gave me a {}'.format(
                number, type(number)))


xlcalculator.evaluator.evaluator.TRUNC = trunc
xlfunctions.TRUNC = trunc
xlfunctions.SUPPORTED_FUNCTIONS['TRUNC'] = 'TRUNC'

Note that because you are importing all functions early in xlcalculator you have to register your function everywhere.

I would propose to create a proper functions object in which you can register new functions by reference instead of partial Python path.

class ExcelFunctions(dict):

    def register(self, func, name=None):
        if name is None:
           name = func.__name__
        self[name.upper()] = func

    def __getattr__(self, name):
        return self[name]

fn  = ExcelFunctions()

# A quick decorator
def register(name=None):
    def reg(func):
        fn.register(func, name)
    return reg

# Example use:

@register('TRUNC')
def trunc(arg):
    return int(arg)

eval(model.cells['A1'].formula.python_code, locals={'fn': fn})

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions