十进制到数字转换的更智能方法

时间:2017-07-14 19:49:49

标签: python python-3.x

给定百分比 - 例如,5.43% - 称其为:

  • 数字形式 - > 5.43
  • 十进制表格 - > 0.0543

两者之间的转换逻辑如下:

input form      output form         operation
----------      -----------         ---------
numeric         numeric             multiply by 1.
decimal         decimal             multiply by 1.
numeric         decimal             multiply by 0.01
decimal         numeric             multiply by 100.

我对以下dict查找的更加pythonic替代感兴趣。因为我会多次调用此转换,所以我更喜欢*不*使用逻辑运算符。 (我想......)

convert = {('num', 'num') : 1.,
           ('dec', 'dec') : 1.,
           ('num', 'dec') : 0.01,
           ('dec', 'num') : 100.
          }

def converter(num, input_form='num', output_form='dec'):
    return num * convert[(input_form, output_form)]

num = 5.43
print(converter(num))

这个问题太宽泛了吗?评论并让我知道,我会尝试磨练我正在寻找的东西,但坦率地说,我只是对看到其他实现感兴趣。基本上,我目前有一个基于类的实现,我想在实例化时建立self的数字和小数形式,然后也使用方法中的函数。

3 个答案:

答案 0 :(得分:1)

您还可以使用属性:

class Convertible:
    def __init(self, value, form='numeric'):
        if form == 'numeric':
            self._numeric = value
        elif form == 'decimal':
            self._numeric = value * 100
        else:
            raise ValueError("form must be 'numeric' or 'decimal'")

    @property
    def numeric(self):
        return self._numeric

    @numeric.setter
    def numeric(self, value):
        self._numeric = value

    @property
    def decimal(self):
        # for Python 2 compatibility, divide by a float
        # to avoid integer division if we have an integer 'numeric' value
        return self._numeric / 100.0

    @decimal.setter
    def decimal(self, value):
        self._numeric = value * 100

因此,您可以设置数字的数字或小数形式,并透明地访问其中任何一种形式。在内部,我们只存储其中一种形式。

你可以像这样使用它:

val = Convertible()

val.numeric = 5.43
print(val.numeric)
# 5.43
print(val.decimal)
# 0.054299999999999994

val.decimal = 0.42
print(val.numeric)
# 42.0
print(val.decimal)
# 0.42

您可以找到有关属性here, for example

的更多信息

答案 1 :(得分:1)

  

我目前有一个基于类的实现,我想在实例化中建立自我的数字和小数形式,然后也在方法中使用该函数。

如果您已经在使用基于类的方法,那么将转换包装到类的properties而不是处理单独的转换字典似乎是最自然的。

class DecimalPercent:
    def __init__(self, value, form='decimal'):
        self._value = value/100 if form == 'percent' else value

    @property
    def decimal(self):
        return self._value

    @decimal.setter
    def decimal(self, value):
        self._value = value

    @property
    def percent(self):
        return self._value * 100

    @percent.setter
    def percent(self, value):
        self._value = value / 100

答案 2 :(得分:1)

在这种情况下使用属性的替代方法 - 只要您知道 - 将定义两个float子类并使用它们,如下所示:

class Num(float):
    pass

class Dec(float):
    pass

def converter(value):
    arg_type = Num if isinstance(value, Num) else Dec if isinstance(value, Dec) else None
    return value * (0.01 if arg_type is Num else 100 if arg_type is Dec else float('nan'))

print(converter(Num(5.43)))  # -> 0.0543
print(converter(Dec(0.12)))  # -> 12.0
print(converter(0.1618))     # -> nan
print(converter(42))         # -> nan