¿Cuál es una forma limpia de convertir un porcentaje de cadena en un flotador?

He buscado en la biblioteca estándar y en StackOverflow, y no he encontrado una pregunta similar. Entonces, ¿hay una manera de hacer lo siguiente sin rodar mi propia función? Puntos de bonificación si alguien escribe una función hermosa si no hay una forma integrada.

def stringPercentToFloat(stringPercent) # ??? return floatPercent p1 = "99%" p2 = "99.5%" print stringPercentToFloat(p1) print stringPercentToFloat(p2) >>>> 0.99 >>>> 0.995 

Related of "¿Cuál es una forma limpia de convertir un porcentaje de cadena en un flotador?"

Utilice la strip('%') , como:

 In [9]: "99.5%".strip('%') Out[9]: '99.5' #convert this to float using float() and divide by 100 In [10]: def p2f(x): return float(x.strip('%'))/100 ....: In [12]: p2f("99%") Out[12]: 0.98999999999999999 In [13]: p2f("99.5%") Out[13]: 0.995 
 float(stringPercent.strip('%')) / 100.0 

Otra forma: float(stringPercent[:-1]) / 100

Escribí el siguiente método que siempre debería devolver la salida con la misma precisión que la entrada, sin errores de punto flotante como en las otras respuestas.

 def percent_to_float(s): s = str(float(s.rstrip("%"))) i = s.find(".") if i == -1: return int(s) / 100 if s.startswith("-"): return -percent_to_float(s.lstrip("-")) s = s.replace(".", "") i -= 2 if i < 0: return float("." + "0" * abs(i) + s) else: return float(s[:i] + "." + s[i:]) 

Explicación

  1. Pele el "%" del final.
  2. Si el porcentaje no tiene ".", Simplemente devuélvalo dividido por 100.
  3. Si el porcentaje es negativo, elimine la función "-" y vuelva a llamar, luego vuelva a convertir el resultado en negativo y devuélvalo.
  4. Eliminar el lugar decimal.
  5. Disminuya i (el índice en el que estaba la posición decimal) en 2, porque queremos desplazar la posición decimal 2 espacios hacia la izquierda.
  6. Si i es negativo, entonces tenemos que rellenar con ceros.
    • Ejemplo: Supongamos que la entrada es "1.33%". Para poder desplazar la posición decimal 2 espacios a la izquierda, tendríamos que rellenar con un cero.
  7. Convertir a un flotador.

Caso de prueba:

 from unittest.case import TestCase class ParsePercentCase(TestCase): tests = { "150%" : 1.5, "100%" : 1, "99%" : 0.99, "99.999%" : 0.99999, "99.5%" : 0.995, "95%" : 0.95, "90%" : 0.9, "50%" : 0.5, "66.666%" : 0.66666, "42%" : 0.42, "20.5%" : 0.205, "20%" : 0.2, "10%" : 0.1, "3.141592653589793%": 0.03141592653589793, "1%" : 0.01, "0.1%" : 0.001, "0.01%" : 0.0001, "0%" : 0, } tests = sorted(tests.items(), key=lambda x: -x[1]) def test_parse_percent(self): for percent_str, expected in self.tests: parsed = percent_to_float(percent_str) self.assertEqual(expected, parsed, percent_str) def test_parse_percent_negative(self): negative_tests = [("-" + s, -f) for s, f in self.tests] for percent_str, expected in negative_tests: parsed = percent_to_float(percent_str) self.assertEqual(expected, parsed, percent_str)