Как преобразовать строки рационального и десятичного числа в плавания в Python?

Я рекомендую сначала прочитать руководство , доступное здесь , чтобы реализовать навигацию снизу для Android .

То, что вы хотите, не имеет особого смысла, должен быть показан пустой экран, на котором написано что-то вроде «Нет доступного контента» или сообщение, которое вам нравится.

В этой ссылке BottomNavigationView вы можете найти все общедоступные методы и слушателей, которые вы можете установить для нижней навигации. Что касается вашего случая, вы можете быть заинтересованы в добавлении этих двух.

setOnNavigationItemReselectedListener ()

setOnNavigationItemSelectedListener ()

С наилучшими пожеланиями, Педро.

9
задан ketorin 22 February 2009 в 22:08
поделиться

10 ответов

Я проанализировал бы строку, если преобразование перестало работать:

>>> def convert(s):
    try:
        return float(s)
    except ValueError:
        num, denom = s.split('/')
        return float(num) / float(denom)
...

>>> convert("0.1234")
0.1234

>>> convert("1/2")
0.5

Обычно использование оценки является плохой идеей, так как это - угроза безопасности. Особенно, если оцениваемая строка пришла не из системы.

17
ответ дан 4 December 2019 в 06:17
поделиться

Поскольку другие указали, с помощью eval потенциально угроза безопасности и конечно дурная привычка войти. (если Вы не думаете, что это столь же опасно как exec, вообразить evalлуг что-то как: __import__('os').system('rm -rf /'))

Однако, если у Вас есть python 2.6 или, можно использовать ast.literal_eval, для которого обеспеченная строка:

может только состоять из следующих структур литерала Python: строки, числа, кортежи, списки, dicts, булевские переменные и Ни один.

Таким образом это должно быть довольно безопасно :-)

7
ответ дан 4 December 2019 в 06:17
поделиться

Другая опция (также только для 2,6 и) fractions модуль.

>>> from fractions import Fraction
>>> Fraction("0.1234")
Fraction(617, 5000)
>>> Fraction("1/2")
Fraction(1, 2)
>>> float(Fraction("0.1234"))
0.1234
>>> float(Fraction("1/2"))
0.5
6
ответ дан 4 December 2019 в 06:17
поделиться

Проблема с оценкой состоит в том, что, как в Python, частное целых чисел является целым числом. Так, у Вас есть несколько вариантов.

Первое должно просто сделать плавания возврата целочисленного деления:

from __future__ import division

Другой должен разделить рациональное число:

reduce(lambda x, y: x*y, map(int, rat_str.split("/")), 1)

Где rat_str является строкой с рациональным числом.

2
ответ дан 4 December 2019 в 06:17
поделиться

/ оператор делает целочисленное деление. Попробуйте:

>>> eval("1.0*" + "1/2")
0.5

Поскольку eval() потенциально опасно, необходимо всегда проверять точно, что Вы являетесь передающими в него:

>>> import re
>>> s = "1/2"
>>> if re.match(r"\d+/\d+$", s):
...     eval("1.0*" + s)
...
0.5

Однако, если Вы переходите к проблеме соответствовать входу против regex во-первых, Вы могли бы также использовать r"(\d+)/(\d+)$" для извлечения числителя и знаменателя сделайте подразделение сами и полностью избегайте eval():

>>> m = re.match(r"(\d+)/(\d+)$", s)
>>> if m:
...     float(m.group(1)) / float(m.group(2))
...
0.5
3
ответ дан 4 December 2019 в 06:17
поделиться

В Python 3 это должно работать.

>>> x = ["0.1234", "1/2"]
>>> [eval(i) for i in x]
[0.1234, 0.5]
1
ответ дан 4 December 2019 в 06:17
поделиться

Использовать from __future__ import division для получения поведения, Вы хотите. Затем в повышении можно сделать что-то как

from __future__ import division
strings = ["0.1234", "1/2", "2/3"]
numbers = map(eval, strings)

вытащить список плаваний из Ваших строк. Если Вы хотите сделать это "правильный" путь, не использовать eval(), но вместо этого запишите функцию, которая принимает строку и вызовы float() на нем, если это не содержит наклонной черты или анализирует строку и делит числитель и знаменатель, если существует наклонная черта в нем.

Один способ сделать это:

def parse_float_string(x)
    parts = x.split('/', 1)
    if len(parts) == 1:
        return float(x)
    elif len(parts) == 2:
        return float(parts[0])/float(parts[1])
    else:
        raise ValueError

Затем просто map(parse_float_string, strings) получит Вас Ваш список.

4
ответ дан 4 December 2019 в 06:17
поделиться

sympy может помочь Вам здесь:

import sympy

half = sympy.Rational('1/2')
p1234 = sympy.Rational('0.1234')
print '%f, %f" % (half, p1234)
1
ответ дан 4 December 2019 в 06:17
поделиться

Поэтому 1 и 2 интерпретируются Python как целые числа и не плавания. Это должен быть 1.0/2.0 или некоторое соединение этого.

0
ответ дан 4 December 2019 в 06:17
поделиться

Предложения с from __future__ import division объединенный с eval будет, конечно, работать.

Вероятно, стоит указать, что предложения, которые не используют eval а скорее проанализируйте строку, делают так потому что eval опасно: если существует некоторый путь к произвольной строке, которая будет отправлена в eval, затем Ваша система уязвима. Таким образом, это - дурная привычка. (Но если это - просто быстрый и грязный код, это является, вероятно, не настолько большим соглашение!)

0
ответ дан 4 December 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: