jQuery Mask 插件:负整数的掩码

jQuery Mask Plugin: mask for negative integers

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

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

例如元素:

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

我使用以下掩码:

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

它适用于 positive 数字,但现在我想添加对 negative[=37= 的支持] 数字。

以下模式均无效:

$('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

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

由于插件不允许您在正则表达式模式中添加 negative/positive 前瞻,我添加了一个 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 to the end of the string when replacing the characters, you could leverage the code from my other 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">

只需选择一个字符来翻译信号,在我的例子中是 Z。

$("#input").mask("Z0999999.00", {

   translation: {
     '0': {pattern: /\d/},
     '9': {pattern: /\d/, optional: true},
     'Z': {pattern: /[\-\+]/, optional: true}
   }

});

并将掩码置于输入上。

<input id="input"/>

你可以这样做:

$('#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, '');
    }
});

如果你使用字符 #,你不能用 - 初始化数字,因此使用 0 翻译

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

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

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

/* 对于负十进制值 */

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