В Python, как я могу разобрать числовую строку , как "545.2222"
его соответствующее значение поплавка 545.2222
? Или разобрать строку "31"
в целое число 31
?
Я просто хочу знать , как разобрать поплавок str
на float
, и (отдельно) в Int str
к int
.
python
parsing
floating-point
type-conversion
integer
Тристан Хавелик
источник
источник
type(my_object)
его. Результат обычно может быть вызван как функция для преобразования. Например,type(100)
результатint
, так что вы можете позвонить,int(my_object)
чтобы попытаться преобразоватьmy_object
в целое число. Это не всегда работает, но это хорошая «первая догадка» при кодировании.int(x) if int(x) == float(x) else float(x)
Ответы:
источник
int(a)
ноint(float(a))
?int(a)
выдаст ошибку, что строка не является допустимым целым числом:,ValueError: invalid literal for int() with base 10: '545.222'
но преобразование из числа с плавающей точкой в int является поддерживаемым преобразованием.ValueError
если вы хотите быть в безопасностиисточник
/
числами с плавающей запятой или к различным результатам для оператора над числами с плавающей запятой. В зависимости от контекста может быть предпочтительным возвращать либо int, либо float, а не оба.try
чтобы сгенерировать исключение, когда оно не конвертируется в плавающее.s = u'\u0000'
ValueError
в соответствующемexcept
: PМетод Python для проверки, является ли строка плавающей точкой:
Более длинное и точное имя для этой функции может быть:
is_convertible_to_float(value)
То, что есть и не является поплавком в Python, может вас удивить:
Вы думаете, что знаете, какие цифры? Вы не так хороши, как вы думаете! Не большой сюрприз.
Не используйте этот код на критически важных для жизни программах!
Таким образом, отлавливание широких исключений, уничтожение канареек и поглощение исключения создает малую вероятность того, что действительное значение с плавающей точкой в виде строки вернет false.
float(...)
Строка кода может не удалось по любой из тысячи причин , которые не имеют ничего общего с содержимым строки. Но если вы пишете жизненно важное программное обеспечение на прототипном языке, например Python, то вы столкнетесь с гораздо большими проблемами.источник
UTF-8
символ китайского языка4
с годами трансформировался в зависимости от того, как разработчики stackoverflow изменяют свою схему кодировки символов в своем наборе инструментов Microsoft. Любопытно видеть, как с годами это происходит, когда новые схемы конверсии отстаивают свои новые идеологии. Но да, любойUTF-8
глиф для восточно-восточного числа не является поплавком Python. Bazinga."- 12.3"
и"45 e6"
TypeError, ValueError
Это еще один метод, который заслуживает упоминания здесь, ast.literal_eval :
То есть, безопасный «Eval»
источник
python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>>
чтобы выяснить, почему это проблема, если вы хотите оставить телефонные номера в покое и не предполагать, что они являются математическими выражениями, тогда этот подход не для вас.ast.literal_eval
и обсуждалась здесь .источник
float("nan")
что вполне допустимое значение с плавающей запятой, которое вышеупомянутый ответ не192.168.0.1
; или"This is not a good approach. :)"
Локализация и запятые
Вы должны рассмотреть возможность запятых в строковом представлении числа, для случаев, подобных
float("545,545.2222")
которым выдается исключение. Вместо этого используйте методы,locale
чтобы преобразовать строки в числа и правильно интерпретировать запятые. Вlocale.atof
методе преобразует к поплавку в одном шаге раз локал было установлено для требуемого номера конвенции.Пример 1 - Соглашения о количестве номеров в США
В Соединенных Штатах и Великобритании запятые могут использоваться в качестве разделителя тысяч. В этом примере с американской локалью запятая обрабатывается как разделитель:
Пример 2 - Европейские условные обозначения
В большинстве стран мира запятые используются для десятичных знаков вместо точек. В этом примере с французским языком запятая правильно обрабатывается как десятичная метка:
Метод
locale.atoi
также доступен, но аргумент должен быть целым числом.источник
x = '1'; locale.atof(x)
возвращается,1.0
когда я действительно хочу1
.locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x)
locale.atoi
при попытке и использоватьlocale.atof
при исключении - это, вероятно, более читабельно.Если вы не противостоите сторонним модулям, вы можете проверить модуль fastnumbers . Он предоставляет функцию fast_real, которая делает именно то, о чем просит этот вопрос, и делает это быстрее, чем реализация на чистом Python:
источник
Пользователи codelogic и harley верны, но имейте в виду, что если вы знаете, что строка является целым числом (например, 545), вы можете вызвать int ("545") без предварительного приведения к числу с плавающей точкой.
Если ваши строки находятся в списке, вы также можете использовать функцию map.
Это хорошо, только если они все одного типа.
источник
Хорошо, что вы просите сделать это отдельно. Если вы смешиваете их, возможно, вы позже настроитесь на проблемы. Простой ответ:
"545.2222"
держаться на плаву:"31"
в целое число:Другие преобразования, целые числа в и из строк и литералов:
Конверсии из разных баз, и вы должны знать базу заранее (по умолчанию 10). Обратите внимание, что вы можете добавить к ним префикс того, что Python ожидает от своих литералов (см. Ниже), или удалить префикс:
Если вы не знаете базу заранее, но знаете, что у них будет правильный префикс, Python может сделать для вас вывод, если вы передадите
0
в качестве базы:Недесятичные (то есть целочисленные) литералы из других базисов
Если ваша мотивация состоит в том, чтобы ваш собственный код четко представлял жестко запрограммированные конкретные значения, вам, возможно, не потребуется конвертировать из баз - вы можете позволить Python сделать это для вас автоматически с правильным синтаксисом.
Вы можете использовать префиксы apropos для автоматического преобразования в целые числа со следующими литералами . Они действительны для Python 2 и 3:
Двоичный, префикс
0b
Октал, префикс
0o
Шестнадцатеричный, префикс
0x
Это может быть полезно при описании двоичных флагов, прав доступа к файлам в коде или шестнадцатеричных значений для цветов - например, не заключайте в кавычки:
Делаем неоднозначные восьмеричные Python 2 совместимыми с Python 3
Если вы видите целое число, которое начинается с 0, в Python 2 это (не рекомендуется) восьмеричный синтаксис.
Это плохо, потому что похоже, что значение должно быть
37
. Таким образом, в Python 3 теперь возникаетSyntaxError
:Преобразуйте восьмеричные числа Python 2 в восьмеричные, которые работают в 2 и 3 с
0o
префиксом:источник
Вопрос кажется немного старым. Но позвольте мне предложить функцию parseStr, которая создает нечто похожее, то есть возвращает целое число или число с плавающей запятой, и если данная строка ASCII не может быть преобразована ни в одну из них, она возвращает ее нетронутой. Код, конечно, может быть изменен, чтобы делать только то, что вы хотите:
источник
1e3
это число в Python, но строка в соответствии с вашим кодом.float("545.2222")
а такжеint(float("545.2222"))
источник
YAML анализатор может помочь вам понять, что тип данных ваша строка. Используйте
yaml.load()
, а затем вы можете использоватьtype(result)
для проверки типа:источник
Я использую эту функцию для этого
Преобразует строку в тип
источник
parse_str(' 1')
(с пробелом) вернетсяNone
, а не1
.источник
except
разделе, если вы ничего не делаете там? float () поднимет для вас.int
либо вfloat
зависимости от того, что представляет строка. Это может вызвать синтаксический анализ исключений или [иметь непредвиденное поведение] [1].источник
Вы должны принять во внимание округление, чтобы сделать это правильно.
Т.е. int (5.1) => 5 int (5.6) => 5 - неправильно, должно быть 6, поэтому мы делаем int (5.6 + 0.5) => 6
источник
int
иfloat
. И это даст исключение, когдаn
это строка, как желательно OP. Возможно , вы имели в виду: Когдаint
результат желательно,round
должно быть сделано преобразование ПОСЛЕ плавать. Если функция ВСЕГДА должна возвращать int, то вам не нужна часть кроме - может быть все тело функцииint(round(float(input)))
. Если функция должна вернуть int, если это возможно, в противном случае float, тогда оригинальное решение Хавьера верное!Я удивлен, что никто не упомянул регулярное выражение, потому что иногда строка должна быть подготовлена и нормализована перед приведением к числу
Применение:
и, кстати, что-то для проверки у вас есть номер:
источник
Для Typecast в Python используйте функции конструктора типа, передавая строку (или любое значение, которое вы пытаетесь привести) в качестве параметра.
Например:
За кулисами python вызывает
__float__
метод objects , который должен возвращать плавающее представление параметра. Это особенно полезно, так как вы можете определять свои собственные типы (используя классы) с помощью__float__
метода, чтобы он мог быть преобразован в float с помощью float (myobject).источник
Это исправленная версия от https://stackoverflow.com/a/33017514/5973334
Это попытается проанализировать строку и вернуть либо,
int
либо вfloat
зависимости от того, что представляет строка. Это может вызвать синтаксический анализ исключений или иметь непредвиденное поведение .источник
Передайте вашу строку этой функции:
Он вернет int, float или string в зависимости от того, что было передано.
строка, которая является int
строка, которая является поплавком
строка, которая является строкой
Строка, которая выглядит как поплавок
источник
Использование:
Это самый Pythonic способ, которым я мог придумать.
источник
float
. Блокtry
…catch
вероятно должен быть внутриfor
цикла.Обрабатывает шестнадцатеричные, восьмеричные, двоичные, десятичные и плавающие
Это решение будет обрабатывать все строковые соглашения для чисел (все, что я знаю).
Этот тестовый пример показывает, о чем я говорю.
Вот тест:
источник
Использование:
источник
Это функция, которая преобразует любые
object
(не толькоstr
) вint
илиfloat
, в зависимости от того, выглядит ли фактическая строка какint
илиfloat
. Кроме того, если это объект, который имеет оба__float
и__int__
методы, по умолчанию используется__float__
источник
Используя методы int и float, мы можем преобразовать строку в целое число и число с плавающей точкой.
источник
eval()
это очень хорошее решение этого вопроса. Он не должен проверять, является ли число int или float, он просто дает соответствующий эквивалент. Если требуются другие методы, попробуйтепопробовать-кроме может также использоваться в качестве альтернативы. Попробуйте преобразовать строку в int внутри блока try. Если строка будет значением с плавающей точкой, она выдаст ошибку, которая будет перехвачена в блоке исключений, например
источник
Вот еще одна интерпретация вашего вопроса (подсказка: она расплывчатая). Возможно, вы ищете что-то вроде этого:
Это работает так ...
Теоретически, существует уязвимость для инъекций. Строка может быть, например
"import os; os.abort()"
. Однако, без каких-либо сведений о происхождении этой строки, существует теоретическое предположение. Поскольку вопрос расплывчат, не совсем понятно, существует ли эта уязвимость на самом деле или нет.источник
eval()
он более чем в 3 раза медленнееtry: int(s) except: float(s)
.eval
это плохая практика (вы должны знать, потому что у вас репутация 310k)