Я рекомендую сначала прочитать руководство , доступное здесь , чтобы реализовать навигацию снизу для Android .
То, что вы хотите, не имеет особого смысла, должен быть показан пустой экран, на котором написано что-то вроде «Нет доступного контента» или сообщение, которое вам нравится.
В этой ссылке BottomNavigationView вы можете найти все общедоступные методы и слушателей, которые вы можете установить для нижней навигации. Что касается вашего случая, вы можете быть заинтересованы в добавлении этих двух.
setOnNavigationItemReselectedListener ()
setOnNavigationItemSelectedListener ()
С наилучшими пожеланиями, Педро.
Я проанализировал бы строку, если преобразование перестало работать:
>>> 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
Обычно использование оценки является плохой идеей, так как это - угроза безопасности. Особенно, если оцениваемая строка пришла не из системы.
Поскольку другие указали, с помощью eval
потенциально угроза безопасности и конечно дурная привычка войти. (если Вы не думаете, что это столь же опасно как exec
, вообразить eval
луг что-то как: __import__('os').system('rm -rf /')
)
Однако, если у Вас есть python 2.6 или, можно использовать ast.literal_eval
, для которого обеспеченная строка:
может только состоять из следующих структур литерала Python: строки, числа, кортежи, списки, dicts, булевские переменные и Ни один.
Таким образом это должно быть довольно безопасно :-)
Другая опция (также только для 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
Проблема с оценкой состоит в том, что, как в Python, частное целых чисел является целым числом. Так, у Вас есть несколько вариантов.
Первое должно просто сделать плавания возврата целочисленного деления:
from __future__ import division
Другой должен разделить рациональное число:
reduce(lambda x, y: x*y, map(int, rat_str.split("/")), 1)
Где rat_str является строкой с рациональным числом.
/
оператор делает целочисленное деление. Попробуйте:
>>> 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
В Python 3 это должно работать.
>>> x = ["0.1234", "1/2"]
>>> [eval(i) for i in x]
[0.1234, 0.5]
Использовать 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)
получит Вас Ваш список.
sympy может помочь Вам здесь:
import sympy
half = sympy.Rational('1/2')
p1234 = sympy.Rational('0.1234')
print '%f, %f" % (half, p1234)
Поэтому 1 и 2 интерпретируются Python как целые числа и не плавания. Это должен быть 1.0/2.0 или некоторое соединение этого.
Предложения с from __future__ import division
объединенный с eval
будет, конечно, работать.
Вероятно, стоит указать, что предложения, которые не используют eval
а скорее проанализируйте строку, делают так потому что eval
опасно: если существует некоторый путь к произвольной строке, которая будет отправлена в eval
, затем Ваша система уязвима. Таким образом, это - дурная привычка. (Но если это - просто быстрый и грязный код, это является, вероятно, не настолько большим соглашение!)