Как я могу использовать номера кредитных карт, содержащие пробелы?

Итак, суммируем комментарии @kath с некоторыми улучшениями, чтобы ответить на ваш следующий вопрос:

df %>%
    group_by(Sensor, BinnedTime = cut(DeviceTime, breaks="30 sec")) %>%
        mutate(Concentration = mean(calCO2)) %>%
    ungroup()

Вышеприведенное будет содержать все столбцы, но дублирует расчет концентрации для каждой строки df. Альтернатива, которая позволит вам одновременно свернуть и сохранить больше интересующих столбцов, - просто добавить их в операцию суммирования, как показано ниже.

    df %>%
    group_by(Sensor, BinnedTime = cut(DeviceTime, breaks="30 sec")) %>%
        summarize(Concentration = mean(calCO2),
                   Date = min(Date),
                   Time = min(Time),
                   StartDeviceTime = min(DeviceTime),
                   EndDeviceTime = max(DeviceTime)) 
12
задан Michael Myers 19 May 2009 в 16:26
поделиться

18 ответов

Я считаю, что любое веб-приложение, которое отклоняет номер кредитной карты с пробелами, не выполняет свою работу. Когда вы получаете номер кредитной карты, это достаточно просто:

String ccNumber = ccNumber.replaceAll("[\\s-]+", "");

удалить пробелы и тире (некоторые тоже их используют). Затем подтвердите результат. Вы просто будете раздражать своих пользователей, если заставите их удалить пробелы, которые вы могли бы сделать так же легко.

Что касается , как проверять, то это зависит от многих вещей, например, от какой веб-платформы вы используете и какие варианты проверки вы выбрали. Например, Struts 1 может использовать или не использовать Apache Commons Validator, тогда как Spring MVC (вероятно) будет использовать проверку Spring и так далее. Поэтому я не могу точно сказать, как проверять, но могу сказать , что проверять.

Во-первых, номер CC с пробелами не должен , а отклоняться. Большинство людей найдут:

4123 0987 8876 2939

намного легче читать, чем:

4123098788762939

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

Во-вторых, вы правильно отображаете номер кредитной карты (даже если некоторые цифры заменены на X из соображений безопасности). Я предлагаю вам прочитать Анатомия номеров кредитных карт .

На этой странице приведены правила количества цифр и допустимых префиксов. Надежное веб-приложение будет реализовывать эти , поэтому вы можете определить, является ли номер кредитной карты недействительным, прежде чем пытаться использовать его . Отправка данных кредитной карты на платежный шлюз может занять до 30 секунд (или, возможно, больше), поэтому не делайте этого, пока не будете уверены, что платеж будет принят. Поступить иначе - значит создать действительно плохой пользовательский опыт. Есть все шансы, что пользователь сдастся, если произойдет сбой 1-2 раза, вместо того, чтобы ждать.

Что касается их отображения, это зависит от количества цифр:

  • 16: 4 группы по 4, разделенные пробелом;
  • 15: как карта American Express , то есть 4-6-5 с пробелом между каждой группой;
  • 14: как карта Diners Club , то есть 4-6- 4 с пробелом между каждой группой;
  • 13: Никогда не видел 13, но на ум приходит 4-5-4 или 4-4-5 или 5-4-4 (или, возможно, 3-3-3-4).

Номер кредитной карты должен быть проверен в соответствии с алгоритмом контрольной суммы, упомянутым на странице , перед отправкой на обработку как часть стандартной процедуры проверки. На этой странице есть реализация этой процедуры на Java.

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

Итак, краткая версия состоит из двух простых правил:

  1. Будьте максимально снисходительны к пользовательскому вводу; и
  2. Сделайте абсолютно все возможное для проверки данных кредитной карты перед отправкой.
80
ответ дан 2 December 2019 в 02:49
поделиться

Конечно. Сожмите пространства. Вероятно, существует миллион способов сделать это; У меня возникло бы искушение использовать String.split (), чтобы разбить его на пробелы, а затем объединить полученные четыре строки. Или используйте StringBuffer.indexOf () и .delteCharAt ().

... или, как сказал Клетус, используйте replaceAll ().

0
ответ дан 2 December 2019 в 02:49
поделиться

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

Почему, если бы только машина могла выполнять «обработку данных», чтобы сама машина могла изменять формат данных! Или, если бы не было такого понятия, как «неподготовленный» покупатель! Увы!

8
ответ дан 2 December 2019 в 02:49
поделиться

Я считаю, что любое веб-приложение, которое отклоняет номер кредитной карты с пробелами, не выполняет свою работу. Когда вы получаете номер кредитной карты, это достаточно просто:

String ccNumber = ccNumber.replaceAll("[\\s-]+", "");

удалить пробелы и дефисы (некоторые тоже их используют). Затем подтвердите результат. Вы просто будете раздражать своих пользователей, если заставите их удалять пробелы, которые вы могли бы сделать так же легко.

Что касается , как проверять, то это зависит от многих вещей, например от какой веб-платформы вы используете и какие варианты проверки вы выбрали. Например, Struts 1 может использовать или не использовать Apache Commons Validator, тогда как Spring MVC (вероятно) будет использовать проверку Spring и так далее. Поэтому я не могу точно сказать, как проверять, но могу сказать , что проверять.

Во-первых, номер CC с пробелами не должен отклоняться , а не . Большинство людей найдут:

4123 0987 8876 2939

намного легче читать, чем:

4123098788762939

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

Во-вторых, вы правильно отображаете номер кредитной карты (даже если некоторые цифры заменены на X из соображений безопасности). Я предлагаю вам прочитать Анатомия номеров кредитных карт .

На этой странице приведены правила для количества цифр и допустимых префиксов. Надежное веб-приложение будет реализовывать эти , поэтому вы можете определить, является ли номер кредитной карты недействительным, прежде чем пытаться использовать его . Отправка данных кредитной карты на платежный шлюз может занять до 30 секунд (или, возможно, больше), поэтому не делайте этого, пока не будете уверены, что платеж будет принят. Поступить иначе - значит создать действительно плохой пользовательский опыт. Есть все шансы, что пользователь сдастся, если произойдет сбой 1-2 раза, вместо того, чтобы ждать.

Что касается их отображения, это зависит от количества цифр:

  • 16: 4 группы по 4, разделенные пробелом;
  • 15: как карта American Express , то есть 4-6-5 с пробелом между каждой группой;
  • 14: как карта Diners Club , то есть 4-6- 4 с пробелом между каждой группой;
  • 13: Никогда не видел 13, но на ум приходит 4-5-4 или 4-4-5 или 5-4-4 (или, возможно, 3-3-3-4).

Номер кредитной карты должен быть проверен в соответствии с алгоритмом контрольной суммы, упомянутым на странице , перед отправкой на обработку как часть стандартной процедуры проверки. На этой странице есть реализация этой процедуры на Java.

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

Итак, краткая версия состоит из двух простых правил:

  1. Будьте максимально снисходительны к вводу пользователя; и
  2. Сделайте абсолютно все возможное для проверки данных кредитной карты перед подачей заявки.
4
ответ дан 2 December 2019 в 02:49
поделиться

К сожалению, нет. Java просто не может справиться с этими требованиями, поскольку эмуляция виртуальной машины Java на чипах x86 сопряжена с большими накладными расходами, что не оставляет места для полезных конструкций, таких как регулярные выражения Perl, которые могут делать это следующим образом:

$input =~ s/\D//g;

Java предприняла попытку добавить регулярные выражения несколько лет назад, но они работали только на чипах PowerPC, которые больше не используются. Проблема заключалась в том, что все регулярные выражения должны были содержаться в виде строк, а не быть конструкцией языка первого класса, и поэтому требовалось удвоение обратной косой черты, но, как всем известно, обратная косая черта означает нечто иное в основной операционной системе для архитектуры x86.

Мой совет - перейти на Perl.

10
ответ дан 2 December 2019 в 02:49
поделиться

Веб-сайты, которые заставляют вас вводить номера кредитных карт (и подобные вещи) в определенном формате - серьезно меня раздражают.

Эти люди доставляют неудобства своим клиентам просто потому, что они (разработчики) являются ленивый. Нет причин не принимать такие вещи, как номера кредитных карт, номера телефонов и т. Д. В любом формате, в котором они указаны. Единственное ограничение - это то, что НЕОБХОДИМО для понимания того, как интерпретировать значение.

Вам не важно, ввожу ли я 5555-4444-3333-2222 или 5555444433332222, просто удалите тире, если они вам не нравятся - то же самое с пробелами. А с телефонными номерами, если вы не собираетесь набирать номер автоматически, вас, вероятно, даже не волнует, в каком он формате, поэтому не раздражайте пользователей, если только вам это не нужно.

11
ответ дан 2 December 2019 в 02:49
поделиться

Я бы пошел дальше, вычеркнув все нечисловые символы, а затем проверил правильность длины перед запуском пользовательского ввода с помощью реальной проверки, такой как алгоритм Луна .

String ccNumber = input.replaceAll("\\D", "");

удаляет все нецифровые символы из String input .

19
ответ дан 2 December 2019 в 02:49
поделиться

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

1
ответ дан 2 December 2019 в 02:49
поделиться

вы можете использовать проверку javascript, используя событие onkeypress , чтобы проверить, действителен ли последний символ, а если не просто удалить его и, возможно, даже отобразить сообщение о том, что введен недопустимый символ. Таким образом, недопустимые числа никогда не вводятся. Он также может автоматически вводить символ-разделитель (пробел или -) в желаемом формате.

0
ответ дан 2 December 2019 в 02:49
поделиться

Реклама на этом сайте ... Всего за $ 49,95 вы можете получить новую специальную клавиатуру, совместимую с этим интернет-магазином. Нажмите здесь, чтобы добавить новую клавиатуру в корзину и оформить заказ. При выезде введите номер своей кредитной карты в специальное поле. Пожалуйста, не вводите пробелы между числами, так как наш магазин не знает, что делать с пробелами между числами.

1
ответ дан 2 December 2019 в 02:49
поделиться

Том,

Технически проблема решена, давайте поговорим о ней теоретически.

Здесь есть две точки зрения. Я не думаю, что это приемлемый ответ: «если пользователь не может понять, это его проблема»

  1. . Будьте твердыми в отношении вашего ввода данных и принимайте только номера кредитных карт, которые имеют правильный формат. Это требует удержания пользователя на странице до тех пор, пока он не сделает все правильно.
  2. Будьте более снисходительны, принимая их намерения и корректируя их ввод для них (только не забудьте дать им экран подтверждения, чтобы проверить новый ввод).

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

В любом случае вы должны проинформировать пользователя о правильной форме ввода (т.е. xxxx-xx-xxxx)

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

Для получения дополнительных советов по регулярным выражениям ознакомьтесь с регулярными выражениями. info

Удачи,

-Роберт

2
ответ дан 2 December 2019 в 02:49
поделиться

Легко.

  • Ваше пространство ввода - это список символов из некоторого набора символов, содержащего все символы.
  • Ваше пространство вывода - это список символов из некоторого набора символов, содержащий только числа.

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

Затем мы пишем две функции.

  1. Преобразуем пространство ввода в пространство пальца
  2. Преобразуем пространство пальца в пространство вывода

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

Уловка состоит в том, чтобы это работало со всеми наборами символов. Я не понял, как определить, соответствует ли определенный символ члену в моем наборе пальцев. Может мне стоит опубликовать это как вопрос.

Мы просто находим одно и то же число в пространстве вывода.

Уловка состоит в том, чтобы это работало со всеми наборами символов. Я не понял, как определить, соответствует ли определенный символ члену в моем наборе пальцев. Может мне стоит опубликовать это как вопрос.

Мы просто находим одно и то же число в пространстве вывода.

Уловка состоит в том, чтобы это работало со всеми наборами символов. Я не понял, как определить, соответствует ли определенный символ члену в моем наборе пальцев. Может мне стоит опубликовать это как вопрос.

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

только один человек, кажется, упомянул алгоритм Луна или mod 10

http://en.wikipedia.org/wiki/Luhn_algorithm

1
ответ дан 2 December 2019 в 02:49
поделиться

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

Вы должны смоделировать свой интерфейс так, чтобы пользователь инстинктивно выполнял ввод контролируемым образом. Проще говоря, сначала спросите у них тип карты, а затем в форме ввода отформатируйте ввод в соответствии с картой. Например, при использовании 16-значной карты, такой как Visa или Mastercard, отобразите 4 поля ввода, разделенных пробелами или тире, которые ограничивают ввод до 4 символов каждое, и автоматически переходят к следующему полю в серии после того, как пользователь вводит четвертую цифру.

На странице он должен выглядеть примерно так:

Номер карты:
[1234] -

  • -
  • -
  • или

    Номер карты:
    [1234] - [123456] - [12345]

    1
    ответ дан 2 December 2019 в 02:49
    поделиться

    Java TM отлично подходит для программирования на стороне сервера, в то время как javascript может быть полезен на стороне клиента; например, во время проверки.

    Действительный номер кредитной карты может иметь длину от 12 (например, Maestro) до 19 (например, Solo, Switch). Клиентский javascript может определить, действителен ли номер карты (только цифры (с дефисами или пробелами), соответствует ли он органу эмитента, контрольная сумма в порядке, ...), и выполнить сопоставление 1: 1 из `` удобочитаемого '' (например,

    American Express    3400 0100 2000 009
    

    ) во внутреннее представление, например

    <input ... id="ccid" value="340001002000009">
    <input ... id="ccissuer" value="AMEX">
    

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

    0
    ответ дан 2 December 2019 в 02:49
    поделиться

    Решение 1. Как насчет того, чтобы просто вставить 4 текстовых поля, которые могут принимать 4-значные числа. Например, как вводятся лицензионные ключи для программного обеспечения. Вы можете активировать переключение полей на следующее в строке после ввода символа пробела или символа табуляции.

    Решение 2. Используйте регулярные выражения, как указано в одном из комментариев, описанных выше. Проблема в том, что вы будете подвержены атакам с помощью инъекций, если это веб-приложение.

    0
    ответ дан 2 December 2019 в 02:49
    поделиться

    Если вы имеете в виду javascript, вы можете использовать метод «перейти к следующему вводу»:

    Вот HTML:

    <form id="ccform" action="cc_submit.php" method="post">
        <fieldset id="ccnumber">
            <input id="firstset" type="text" maxlength="4" />
            <input id="secondset" type="text" maxlength="4" />
            <input id="thirdset" type="text" maxlength="4" />
            <input id="fourthset" type="text" maxlength="4" />
        </fieldset>
    </form>
    

    А вот JS:

    var ccfields;
    
    function moveToNext(e) {
        var field = e.currentTarget;
        var chars = field.value.length;
        var setnumb = Number(field.id.substr(3,1)) - 1;
        if(chars >= 4 && setnumb < 3) {
            ccfields[setnumb + 1].focus();
        }
    }
    
    window.onload = function() {
        ccfields = document.getElementById("ccnumber").getElementsByTagName("input");
        for (var i = 0; i < ccfields.length; i++) {
            ccfields[i].onkeyup = moveToNext;
        }
    };
    

    Конечно, вы захотите добавить функцию, которая проверяет наличие нечисловых значений, и функцию, которая берет четыре поля и объединяет их в одну строку для передачи обратно в форма. Также неплохо использовать библиотеку js, такую ​​как Jquery, чтобы гарантировать, что события обрабатываются одинаково и упростить обход входных данных, чтобы вы могли без путаницы использовать такие атрибуты, как «имя».

    Но обычно, если люди видят 4 поля, это облегчает ввод их числа, и для тех посетителей, которые думают: «Ой, я должен использовать свою мышь для каждого числа»

    0
    ответ дан 2 December 2019 в 02:49
    поделиться

    Я написал эту пару функций Perl в магазине, где разрешено использование только Visa (... Visa, на самом деле ...) еще в 1998 году.

    sub mod10_checkdigit
    {
        my($acct) = @_;
        die "invalid account number in BRPS::mod10_checkdigit"
            unless $acct =~ m%^\d+$%;
        my(@digits) = split //, $acct;
        my($len) = scalar(@digits);
        print "# ($len) @digits\n" if ($ENV{PERL_BRPS_DEBUG});
        my($i, $sum, $chk);
        my($mul) = (($len % 2) == 1) ? 1 : 2;
        $len--;
        for ($i = 0; $i < $len; $i++)
        {
            my($val) = $mul * $digits[$i];
            # Note that we need the digital root of the value, but $val is not
            # greater than 18 (because $digits[$i] <= 9 and $mul <= 2).
            $val -= 9 if ($val >= 10);
            $sum += $val;
            print "# $i: $digits[$i] * $mul => $val => $sum\n" if ($ENV{PERL_BRPS_DEBUG});
            $mul = 3 - $mul;
        }
        $chk = 10 - ($sum % 10);
        $chk = 0 if ($chk == 10);
        return $chk;
    }
    
    sub validate_account
    {
        my($acct) = @_;
        # Strip leading and trailing blanks
        $acct =~ s/^\s*(\S.*\S)\s*$/$1/;
        my($clean) = $acct;
        # Check that account number is string of digits, blanks and dashes
        return undef, "account number is not a sequence of digits, blanks and dashes"
            unless $acct =~ m/^[- \d]+$/;
        return undef, "account number is not a Visa account number"
            unless $acct =~ m/^4/;
        # Remove non-digits
        $clean =~ s/\D//g;
        return undef, "account number is neither 13 nor 16 digits"
            unless length($clean) == 16 || length($clean) == 13;
        # Punctuators must be reasonably consistent!
        return undef, "invalid punctuation pattern"
            unless ($acct =~ m/^\d{16}$/o or $acct =~ m/^\d{13}$/o or
                    $acct =~ m/^\d{4}[- ]\d{4}[- ]\d{4}[- ]\d{4}$/o or
                    $acct =~ m/^\d{4}[- ]\d{3}[- ]\d{3}[- ]\d{3}$/o);
        # Determine check digit
        my($chk) = mod10_checkdigit($clean);
        return undef, "check digit on account number is incorrect"
            unless $clean =~ m/$chk$/;
        return $clean, "ok";
    }
    

    Допускаются достоверные номера кредитных карт. Нетрудно обобщить и для Mastercard, Discover, American Express.

    Rant

    Мне не нравятся веб-сайты, которые настаивают на том, чтобы я вводил данные в их внутреннем формате. Черт возьми - сохранить число как большое целое число и отправить его как чистую строку цифр; это нормально для компьютеров. Но позвольте мне ввести распознаваемые человеком удобочитаемые форматы - даже повторно представить данные в удобочитаемом формате. На веб-сайтах, которые обрабатывают номера кредитных карт, слишком много лени.

    0
    ответ дан 2 December 2019 в 02:49
    поделиться
    Другие вопросы по тегам:

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