Проверка процента JavaScript

Вы можете использовать np.vectorize для создания векторизованной функции, которая может принимать столбцы данных в качестве параметров (или любые другие типы, подобные массиву). См. Мой пример ниже (обратите внимание, что аргументы, передаваемые в векторизованной функции, должны иметь одинаковую длину):

def foo(val1, val2, val3):
    """ do some stuff in here with your function parameters """
    return val1 * val2 * val3

# this will create a new column in your dataframe called 'new_col'
# each row in df.new_col will be the result of foo applied to that row
df['new_col'] = np.vectorize(foo)(df.col1, df.col2, df.col3)

См. Документы для np.vectorize .

8
задан Joel Cunningham 23 October 2008 в 10:07
поделиться

7 ответов

Вместо того, чтобы использовать регулярные выражения для этого, я просто преобразовал бы введенный номер пользователя в значение с плавающей точкой и затем проверил бы на диапазон, который Вы хотите (от 0 до 100). При попытке сделать числовая проверка диапазона с регулярными выражениями является почти всегда неправильным инструментом для задания.

var x = parseFloat(str);
if (isNaN(x) || x < 0 || x > 100) {
    // value is out of range
}
31
ответ дан 5 December 2019 в 04:34
поделиться

Это напоминает мне о старой записи в блоге Alex Papadimoulis (известности The Daily WTF), где он рассказывает следующую историю:

"Клиент попросил, чтобы я создал и установил пользовательскую отлогую систему. Я в точке, где я должен закрепить ее, но я не уверен, что использовать для обстрела гвоздей в. Я должен использовать старую обувь или стеклянную бутылку?"

Как Вы ответили бы на вопрос?

  1. Это зависит. Если Вы будете надеяться загонять маленький (20-фунтовый) гвоздь в чем-то как гажа, то Вы найдете намного легче использовать бутылку, особенно если обувь будет грязна. Однако, при попытке забить тяжелый гвоздь в некоторый лес, пойдите с обувью: бутылка с разрушается в Вашей руке.

  2. Существует что-то существенно неправильно со способом, которым Вы создаете; необходимо использовать реальные инструменты. Да, это может включить прохождение в панель инструментов (или даже в хозяйственный магазин), но выполнение его правильный путь собирается сэкономить много времени, денег и ухудшения в течение жизненного цикла Вашего продукта. Необходимо прекратить создавать вещи за деньги, пока Вы не понимаете основы конструкции.

Это - такой вопрос, где большинство людей рассматривает его как проблему придумать корректное регулярное выражение для решения проблемы, но было бы намного лучше просто сказать, что регулярные выражения использования используют неправильный инструмент для задания.

Проблема при попытке использовать regex для проверки числовых диапазонов состоит в том, что трудно измениться, если требования для позволенного диапазона являются изменениями. Сегодня требование может быть должно проверить числа между 0 и 100, и возможно записать regex для того, что не заставляет Ваши глаза выйти за край. Но на следующей неделе requirment, возможно, изменяет так значения между 0, и 315 позволяются. Удача, изменяющая Ваш regex.

Решение, данное Greg Hewgill, вероятно, лучше - даже при том, что оно проверило бы "99fxx" как "99". Но, учитывая обстоятельства, которые могли бы на самом деле быть в порядке.

5
ответ дан 5 December 2019 в 04:34
поделиться

Я предлагаю этого:

(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)

Это соответствует 100, 100,0 и 100,00 использования этой части

^100(\.0{1,2})?$

и числа как 0, 15, 99, 3.1, 21,67 использования

^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$

Отметьте, какие начальные нули запрещаются, но конечные нули позволяются (хотя не больше, чем два десятичных разряда).

13
ответ дан 5 December 2019 в 04:34
поделиться

Учитывая, что Ваше значение находится на ул.

str.match(/^(100(\.0{1,2})?|([0-9]?[0-9](\.[0-9]{1,2})))$/)
1
ответ дан 5 December 2019 в 04:34
поделиться

(100|[0-9]{1,2})(\.[0-9]{1,2})?

Это должно быть regex, который Вы хотите. Я предлагаю, чтобы Вы считали Регулярное выражение Освоения и загрузили RegexBuddy или тренера Regex.

0
ответ дан 5 December 2019 в 04:34
поделиться

@mlarsen: Не то, что regex здесь не сделает задания лучше.

Помните что проверка msut быть сделанными и на клиенте и на стороне сервера, таким образом, что-то как:

100|(([1-9][0-9])|[0-9])(\.(([0-9][1-9])|[1-9]))?

был бы межъязыковая проверка, просто остерегалась бы проверки входной длины с выходной продолжительностью соответствия.

0
ответ дан 5 December 2019 в 04:34
поделиться
^100(\.(0){0,2})?$|^([1-9]?[0-9])(\.(\d{0,2}))?\%$

Это соответствовало бы:
100.00
дополнительный "1-9" сопровождаемых цифрой (это делает международную часть), дополнительно сопровождаемый точкой и двумя цифрами


Из того, что я вижу, пример Greg Hewgill действительно не работает, что хорошо, потому что parseFloat ('15x') просто возвратился бы 15, который будет соответствовать 0 <x <100 условий. Используя parseFloat является явно неправильным, потому что он не проверяет значение процента, он пытается вызвать проверку. Некоторые люди здесь жалуются на продвижение, обнуляет, и некоторые игнорируют запаздывание недопустимых символов. Возможно, автор вопроса должен отредактировать его и ясно дать понять, в чем он нуждается.

0
ответ дан 5 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

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