jquery.inputmask.numeric.extensions.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. Input Mask plugin extensions
  3. http://github.com/RobinHerbots/jquery.inputmask
  4. Copyright (c) 2010 - 2014 Robin Herbots
  5. Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
  6. Version: 0.0.0
  7. Optional extensions on the jquery.inputmask base
  8. */
  9. (function ($) {
  10. //number aliases
  11. $.extend($.inputmask.defaults.aliases, {
  12. 'numeric': {
  13. mask: function (opts) {
  14. var mask = opts.prefix;
  15. mask += "[+]";
  16. mask += "~{1," + opts.integerDigits + "}";
  17. if (parseInt(opts.digits) > 0)
  18. mask += "[" + opts.radixPoint + "~{" + opts.digits + "}]";
  19. mask += opts.suffix;
  20. return mask;
  21. },
  22. placeholder: "",
  23. greedy: false,
  24. numericInput: false,
  25. isNumeric: true,
  26. digits: "*", //number of fractionalDigits
  27. groupSeparator: "",//",", // | "."
  28. radixPoint: ".",
  29. groupSize: 3,
  30. autoGroup: false,
  31. allowPlus: true,
  32. allowMinus: true,
  33. integerDigits: "*", //number of integerDigits
  34. defaultValue: "",
  35. prefix: "",
  36. suffix: "",
  37. postFormat: function (buffer, pos, reformatOnly, opts) {
  38. if (opts.groupSeparator == "") return pos;
  39. var cbuf = buffer.slice(),
  40. radixPos = $.inArray(opts.radixPoint, buffer);
  41. if (!reformatOnly) {
  42. cbuf.splice(pos, 0, "?"); //set position indicator
  43. }
  44. var bufVal = cbuf.join('');
  45. if (opts.autoGroup || (reformatOnly && bufVal.indexOf(opts.groupSeparator) != -1)) {
  46. var escapedGroupSeparator = $.inputmask.escapeRegex.call(this, opts.groupSeparator);
  47. bufVal = bufVal.replace(new RegExp(escapedGroupSeparator, "g"), '');
  48. var radixSplit = bufVal.split(opts.radixPoint);
  49. bufVal = radixSplit[0];
  50. var reg = new RegExp('([-\+]?[\\d\?]+)([\\d\?]{' + opts.groupSize + '})');
  51. while (reg.test(bufVal)) {
  52. bufVal = bufVal.replace(reg, '$1' + opts.groupSeparator + '$2');
  53. bufVal = bufVal.replace(opts.groupSeparator + opts.groupSeparator, opts.groupSeparator);
  54. }
  55. if (radixSplit.length > 1)
  56. bufVal += opts.radixPoint + radixSplit[1];
  57. }
  58. buffer.length = bufVal.length; //align the length
  59. for (var i = 0, l = bufVal.length; i < l; i++) {
  60. buffer[i] = bufVal.charAt(i);
  61. }
  62. var newPos = $.inArray("?", buffer);
  63. if (!reformatOnly) buffer.splice(newPos, 1);
  64. return reformatOnly ? pos : newPos;
  65. },
  66. onKeyDown: function (e, buffer, opts) {
  67. var $input = $(this), input = this;
  68. if (opts.autoGroup && e.keyCode == opts.keyCode.DELETE || e.keyCode == opts.keyCode.BACKSPACE) {
  69. opts.postFormat(buffer, 0, true, opts);
  70. return { "refreshFromBuffer": true };
  71. }
  72. },
  73. regex: {
  74. integerPart: function (opts) { return new RegExp('[-\+]?\\d+'); }
  75. },
  76. definitions: {
  77. '~': {
  78. validator: function (chrs, buffer, pos, strict, opts) {
  79. if (!strict && chrs === "-") {
  80. var matchRslt = buffer.join('').match(opts.regex.integerPart(opts));
  81. if (matchRslt.length > 0) {
  82. if (buffer[matchRslt.index] == "+") {
  83. buffer.splice(matchRslt.index, 1);
  84. return { "pos": matchRslt.index, "c": "-", "refreshFromBuffer": true, "caret": pos };
  85. } else if (buffer[matchRslt.index] == "-") {
  86. buffer.splice(matchRslt.index, 1);
  87. return { "refreshFromBuffer": true, "caret": pos - 1 };
  88. } else {
  89. return { "pos": matchRslt.index, "c": "-", "caret": pos + 1 };
  90. }
  91. }
  92. }
  93. var isValid = strict ? new RegExp("[0-9" + $.inputmask.escapeRegex.call(this, opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs);
  94. if (isValid != false && !strict && chrs != opts.radixPoint) {
  95. var newPos = opts.postFormat(buffer, pos, (chrs == "-" || chrs == "+") ? true : false, opts);
  96. return { "pos": newPos, "refreshFromBuffer": true };
  97. }
  98. return isValid;
  99. },
  100. cardinality: 1,
  101. prevalidator: null
  102. },
  103. '+': {
  104. validator: function (chrs, buffer, pos, strict, opts) {
  105. var signed = "[";
  106. if (opts.allowMinus === true) signed += "-";
  107. if (opts.allowPlus === true) signed += "\+";
  108. signed += "]";
  109. var isValid = new RegExp(signed).test(chrs);
  110. return isValid;
  111. },
  112. cardinality: 1,
  113. prevalidator: null
  114. }
  115. },
  116. insertMode: true,
  117. autoUnmask: false
  118. },
  119. 'decimal': {
  120. alias: "numeric"
  121. },
  122. 'integer': {
  123. alias: "numeric",
  124. digits: "0"
  125. }
  126. });
  127. })(jQuery);