【问题标题】:Allowing numbers ending in 5 and 0 only只允许以 5 和 0 结尾的数字
【发布时间】:2014-03-17 12:07:46
【问题描述】:

我正在寻找一个表单验证脚本(大概是 JavaScript?)。

我们希望这是一个输入文本字段,而不是下拉菜单。该公司提供定制切割各种长度的产品。最小订单为 0.5m,之后他们只想允许以0.05m 为增量的长度,如下所示:

仅允许两位小数点以05 结尾的数字(如果存在)。

  • 0.50(最小订单)
  • 0.55
  • 0.60
  • 0.65
  • 等等……
  • 1.00
  • 1.05
  • 1.10
  • 1.15
  • 等等……
  • 130.00
  • 130.05
  • 130.10
  • 等等……

有什么想法吗?有什么建议吗?

更新:

我意识到解决方案需要合并到一些现有脚本中,这可能会使情况复杂化或简化?这是处理表单提交时的操作的代码。

<script type="text/javascript"><!--

  $('select[name="profile_id"], input[name="quantity"]').change(function(){
    $.ajax({
    url: 'index.php?route=product/product/getRecurringDescription',
    type: 'post',
    data: $('input[name="product_id"], input[name="quantity"], select[name="profile_id"]'),
    dataType: 'json',
        beforeSend: function() {
            $('#profile-description').html('');
        },
    success: function(json) {
        $('.success, .warning, .attention, information, .error').remove();

        if (json['success']) {
                $('#profile-description').html(json['success']);
        }   
    }
  });
  });

  $('#button-cart').bind('click', function() {
  $.ajax({
    url: 'index.php?route=checkout/cart/add',
    type: 'post',
    data: $('.product-info input[type=\'text\'], .product-info input[type=\'hidden\'], .product-info input[type=\'radio\']:checked, .product-info input[type=\'checkbox\']:checked, .product-info select, .product-info textarea'),
    dataType: 'json',
    success: function(json) {
        $('.success, .warning, .attention, information, .error').remove();

        if (json['error']) {
            if (json['error']['option']) {
                for (i in json['error']['option']) {
                    $('#option-' + i).after('<span class="error">' + json['error']['option'][i] + '</span>');
                }
            }

                if (json['error']['profile']) {
                    $('select[name="profile_id"]').after('<span class="error">' + json['error']['profile'] + '</span>');
                }
        } 

        if (json['success']) {
            $('#notification').html('<div class="success" style="display: none;">' + json['success'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>');

            $('.success').fadeIn('slow');

            $('#cart-total').html(json['total']);

            $('html, body').animate({ scrollTop: 0 }, 'slow'); 
        }   
    }
  });
  });
  //--></script>

【问题讨论】:

  • 尝试搜索字符类。还有锚。还有一个关于正则表达式的教程。
  • 数字是浮点数还是字符串?这对于该方法非常重要...
  • 0.00 会满足 moob
  • 有人向我建议您可以使用汇总功能?因此,如果用户输入 1.03,它会四舍五入到 1.05,如果他们输入 1.17,它会四舍五入到 1.20 - 想法?

标签: javascript regex forms validation


【解决方案1】:

您可以使用此功能。这将检查该值是否大于或等于 0.5 以及该值是否为 0.05 的乘积:

function check(value) {
    var val = value * 1000;
    var ok = (val>=500) && (val % 50 == 0);
    console.log(value, ok);
    return ok;
}
check(0.50);
check(0.55);
check(0.60);
check(0.65);
check(0.51);
check(0.157);
check(0.64);
check(0.1165);

输出

0.5 true
0.55 true
0.6 true
0.65 true
0.51 false
0.157 false
0.64 false
0.1165 false

【讨论】:

  • 谢谢。不幸的是,我是一个 Javascript 新手——你能告诉我如何在用户点击提交时将该逻辑合并到检查文本字段的输入中吗?
  • @SomeGuy,看这个演示 -> jsfiddle.net/QTW6N,一个输入字段(长度)和一个提交按钮,提醒输入的值是否可以接受。
  • 谢谢你,我真的很感激。我遇到的唯一障碍是结帐页面。这列出了用户购物篮中的所有产品及其数量,用户可以从此页面编辑这些产品。每个数量框都有 ID "quantity[]" - 即唯一的。无论如何要检查页面上的所有数量*框,还是我应该将其作为一个新问题发布?
  • 我已更新我的原始问题以显示适用于各个产品页面的代码。这会使您建议的功能的集成变得复杂还是容易?
  • 这个工作需要一些额外的帮助,谢谢。
【解决方案2】:

我相信你可以在 JS 中修改小数。您需要使用一个函数来测试数字的“相等性”,因为它们是浮点数。

function validate(num){
    return approximatelyEqual(num % 0.05, 0);
}

function approximatelyEqual(x, y){
    return Math.abs(x - y) < 0.00000001;
}

(这是假设您已经将输入转换为数字。)

【讨论】:

  • 知道这是否可以与我更新原始问题的代码结合使用吗?
  • 是的,它可以与任何东西一起使用...如果您不知道如何使用它,也许您应该发布一个不同的问题来概述您遇到的问题。 SO 并不意味着是“为我做我的编程”之类的网站,但如果这就是您正在寻找的内容,那么互联网上肯定有论坛可以逐步引导您完成项目。跨度>
  • 粗略看一下您提供的代码,用户似乎没有任何机会输入错误的数字。我看到看起来像一个按钮和一个选择语句,但没有输入框。那么你为什么要首先验证数据呢?也许你可以多解释一下这个项目的组成部分是什么,然后就会更清楚了。
【解决方案3】:

字符类 [05] 匹配一个数字 05
[0-9] 匹配一个从 0 到 9 的数字
\. 匹配一个点。

结合所有,你有你的正则表达式:

^[0-9]+\.[0-9][05]$

下一个考虑最小值是0.50

^(?:0\.[5-9]|[1-9][0-9]*\.[0-9])[05]$

【讨论】:

    【解决方案4】:

    与您的特定数字匹配的正则表达式是这个:

    ^\d+(?:\.\d?[05])?$
    

    演示:http://regex101.com/r/yO6eO2

    这不是一个很好的检查,例如它允许数字以 0 开头。如果这让您感到困扰,您可以通过查看其他数字正则表达式来轻松解决它。

    这是一个在 JavaScript 中集成解决方案的演示:

    http://jsbin.com/wutizuri/1

    当输入包含有效数字时,它应该在提交错误条目时不执行任何操作并转到 /valid。

    代码:http://jsbin.com/wutizuri/1/edit

    【讨论】:

    • 最小订单数为 0.5,因此您需要允许以 0 开头的数字吗?使用正则表达式,当他们单击提交时,您可以将其合并到文本字段上的 Javascript 检查中吗?
    • 我的意思是 000.60 与正则表达式匹配。当然,您可以使用它来验证提交时文本字段中的值。我将添加一个示例。
    • 在结帐/购物车页面上,它显示了他们购物篮中的所有产品以及每个产品旁边的数量。每个数量都在一个输入字段中并且具有不同的 ID(由数量[] 处理),这允许用户更新他们的数量而无需返回每个产品页面。您的 JS 示例会检查所有输入字段还是如何检查?
    【解决方案5】:

    如果只为支持 HTML5 的浏览器提供服务,那么您可以这样做。

    HTML

    <form>
        <input id="cutLength" type="number" min="0.5" step="0.05" value="0.5" required></input>
        <input type="submit" value="Submit"></input>
    </form>
    

    Javascript

    document.getElementById('cutLength').addEventListener('invalid', function () {
        if (this.validity.rangeUnderflow) {
            this.setCustomValidity("Minimum order of 0.5m");
        } else if (this.validity.stepMismatch) {
            this.setCustomValidity("Order must be in steps of 0.05m");
        } else if (this.validity.typeMismatch || this.validity.valueMissing) {
            this.setCustomValidity("Please enter a number for the length");
        }
    }, false);
    

    开启jsFiddle

    如果您想对该主题进行一些阅读,那么这是一篇相当不错的文章。 http://www.html5rocks.com/en/tutorials/forms/constraintvalidation/

    它指向底部可用的 polyfill。

    【讨论】:

    • 谢谢,很遗憾,在这种情况下我们需要支持尽可能多的浏览器。
    • 这就是 polyfill 的用途。其中提到的一个是Webshim,但还有其他的。
    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 2019-06-18
    • 2014-06-09
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多