【问题标题】:jQuery Mask Plugin: mask for negative integersjQuery Mask Plugin:负整数的掩码
【发布时间】:2016-01-07 17:01:17
【问题描述】:

我在我的网络项目中使用jQuery Mask Plugin。它被广泛使用,我暂时不想更改它。

我对带有小数分隔符的数字使用以下掩码:

例如对于元素:

<input class="number-field" value="123456">

我使用以下掩码:

$('input.number-field').mask('#,##0', {'reverse': true});

它适用于数字,但现在我想添加对数字的支持。

以下模式均无效:

$('input.number-field').mask('#,##0Z', {
  reverse: true,
  translation: {
    'Z': {
      pattern: /\-?/
    }
  }
})

$('input.number-field').mask('Z#,##0', {
  reverse: true,
  translation: {
    'Z': {
      pattern: /\-?/
    }
  }
})

$('input.number-field').mask('Z#,##0', {
  reverse: true,
  translation: {
    'Z': {
      pattern: /-/,
      optional: true
    }
  }
})

最后一个似乎有效,但仅适用于该行中的 4 位数字。

如何使用此插件处理负数?如果有人能提出一个想法,我什至可以考虑修补这个插件。

你可以试试jsFiddle template

【问题讨论】:

    标签: javascript jquery regex jquery-mask


    【解决方案1】:

    我扩展了您上次的尝试并将特殊的 # 字符转换为递归地接受数字和破折号(即 /[\d-]/)。然后我将屏蔽模式更改为#,##0

    由于该插件不允许您在正则表达式模式中添加负/正前瞻,因此我添加了一个 onChange 回调以防止 - 字符出现在字符串开头之外的任何位置。

    • .replace(/(?!^)-/g, '') - 这将删除所有不在行首的 - 字符。
    • .replace(/^,/, '') - 这将删除前导 , 字符(即,它将从 ,123 之类的字符串中删除 ,)。
    • .replace(/^-,/, '-') - 这将删除紧跟在- 字符之后的, 字符(即,它将从-,123 中删除,)。

    Updated Example

    $('input.number-field').mask('#,##0', {
      reverse: true,
      translation: {
        '#': {
          pattern: /-|\d/,
          recursive: true
        }
      },
      onChange: function(value, e) {      
        e.target.value = value.replace(/(?!^)-/g, '').replace(/^,/, '').replace(/^-,/, '-');
      }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.13.4/jquery.mask.min.js"></script>
    <input class="number-field" value="123456">

    此外,如果您想在替换字符时将prevent the cursor indicator from jumping 放在字符串的末尾,您可以利用我的另一个answer here 中的代码。

    $('input.number-field').mask('#,##0', {
      reverse: true,
      translation: {
        '#': {
          pattern: /-|\d/,
          recursive: true
        }
      },
      onChange: function(value, e) {
        var target = e.target,
            position = target.selectionStart; // Capture initial position
    
        target.value = value.replace(/(?!^)-/g, '').replace(/^,/, '').replace(/^-,/, '-');
    
        target.selectionEnd = position; // Set the cursor back to the initial position.
      }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.13.4/jquery.mask.min.js"></script>
    <input class="number-field" value="123456">

    【讨论】:

    • 谢谢!工作正常!我也只对非输入元素进行了一些修改。只需检查$(target).prop("tagName") == 'INPUT' 并使用innerHTML 而不是value 否则。
    • 我唯一的批评是,为了输入负数,您必须在输入原始数值之后按 [Home] 键,否则 @掩码末尾的 987654347@ (#,##0) 可防止您以任何其他方式输入负值。我希望有一种方法可以捕获任何输入的值在输入第一个值之后,如果它是负号,则将其放在数字的前面。这样,你可以输入“254-”,它会自动变成“-254”。否则,很好的答案!为我工作。
    【解决方案2】:

    只需选择一个字符来翻译信号,我的情况是 Z。

    $("#input").mask("Z0999999.00", {
    
       translation: {
         '0': {pattern: /\d/},
         '9': {pattern: /\d/, optional: true},
         'Z': {pattern: /[\-\+]/, optional: true}
       }
    
    });
    

    并将掩码放在输入上。

    <input id="input"/>
    

    【讨论】:

    • 是否可以使用小数分隔符?我想将数字“-123456789.12”视为“-123,456,789.12”。你是怎么做到的?
    • 要做到这一点,您可以使用反向输入。但是有一个问题,你需要在输入数字后加上符号,将光标移动到第一个数字字符。看这里:embed.plnkr.co/RnfflU31V0XMtO4CEgsm
    • 您可以做一个技巧将光标放在第一个位置,并且符号字符可以正常工作。看看这个 plunkr,plnkr.co/edit/RnfflU31V0XMtO4CEgsm?p=preview
    【解决方案3】:

    如果回调不起作用,您可以

    $(this).find("td.selling").each(function (i, element) {
            $(element).unmask().mask('###.###.###.###.###.###.###.###', {
                reverse: true,
                translation: {
                    '#': {
                        pattern: /\-|\d/,
                        recursive: true
                    }
                },
            });
            $(element).text($(element).text().replace('-.', '-'));
           
        });
    

    【讨论】:

      【解决方案4】:

      /* 对于负十进制值 */

      $('.money').mask("#.##0,00", {
        reverse: true,
        translation: {
          '0': { pattern: /\d/ },
          '#': {
            pattern: /\-|\d/, /*signal included*/
            recursive: true
          },
        }
      });
      

      【讨论】:

        【解决方案5】:

        你可以这样做:

        $('#input').mask('000.000,00', {
                    reverse: true,
                    translation: { 
                        '0': {
                            pattern: /-|\d/,
                            recursive: true
                        }
                    },
        onChange: function(value, e) {
            e.target.value = value.replace(/^-\./, '-').replace(/^-,/, '-').replace(/(?!^)-/g, '');
            }
        });
        

        如果你使用de charactere #,你不能用-初始化数字然后使用0翻译

        1. value.replace(/^-\./, '-') 这会将-. 之类的字符串更改为 -
        2. replace(/^-,/, '-') 这会将-, 之类的字符串更改为-
        3. replace(/(?!^)-/g, '') 这将删除字符- 不在行首

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-06
          • 2016-09-10
          • 2013-11-05
          • 1970-01-01
          • 1970-01-01
          • 2021-05-01
          • 2021-05-05
          相关资源
          最近更新 更多