angular-dynamic-number
Advanced tools
Comparing version 1.1.0 to 1.1.1
{ | ||
"name": "angular-dynamic-number", | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"homepage": "https://github.com/uhlryk/angular-dynamic-number", | ||
@@ -5,0 +5,0 @@ "authors": [ |
{ | ||
"name": "angular-dynamic-number", | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"description": "Highly customizable angular directive for numbers", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
/*jslint node: true */ | ||
"use strict"; | ||
function convModelToView(modelValue, viewSeparator){ | ||
if(viewSeparator === ',') { | ||
return String(modelValue).replace(".",","); | ||
} else { | ||
return modelValue; | ||
(function(window, angular, undefined) {"use strict"; | ||
function convModelToView(modelValue, viewSeparator){ | ||
if(viewSeparator === ',') { | ||
return String(modelValue).replace(".",","); | ||
} else { | ||
return modelValue; | ||
} | ||
} | ||
} | ||
function convViewToModel(viewValue, viewSeparator) { | ||
if(viewSeparator === ',') { | ||
return String(viewValue).replace(",","."); | ||
} else { | ||
return viewValue; | ||
function convViewToModel(viewValue, viewSeparator) { | ||
if(viewSeparator === ',') { | ||
return String(viewValue).replace(",","."); | ||
} else { | ||
return viewValue; | ||
} | ||
} | ||
} | ||
function initIntegerPart(attrs_num_int, def_num_int){ | ||
if(attrs_num_int >= 0){ | ||
var _num_int = parseInt(attrs_num_int,10); | ||
if(isNaN(_num_int) === false && isFinite(_num_int) && _num_int >= 0){ | ||
return _num_int; | ||
function initIntegerPart(attrs_num_int, def_num_int){ | ||
if(attrs_num_int >= 0){ | ||
var _num_int = parseInt(attrs_num_int,10); | ||
if(isNaN(_num_int) === false && isFinite(_num_int) && _num_int >= 0){ | ||
return _num_int; | ||
} | ||
} | ||
return def_num_int; | ||
} | ||
return def_num_int; | ||
} | ||
function initFractionPart(attrs_num_fract, def_num_fract){ | ||
if(attrs_num_fract >= 0){ | ||
var _num_fract = parseInt(attrs_num_fract,10); | ||
if(isNaN(_num_fract) === false && isFinite(_num_fract) && _num_fract >= 0){ | ||
return _num_fract; | ||
function initFractionPart(attrs_num_fract, def_num_fract){ | ||
if(attrs_num_fract >= 0){ | ||
var _num_fract = parseInt(attrs_num_fract,10); | ||
if(isNaN(_num_fract) === false && isFinite(_num_fract) && _num_fract >= 0){ | ||
return _num_fract; | ||
} | ||
} | ||
return def_num_fract; | ||
} | ||
return def_num_fract; | ||
} | ||
function initSeparator(attrs_num_sep, def_num_sep){ | ||
if(attrs_num_sep === ','){ | ||
return ','; | ||
} else if(attrs_num_sep === '.'){ | ||
return '.'; | ||
function initSeparator(attrs_num_sep, def_num_sep){ | ||
if(attrs_num_sep === ','){ | ||
return ','; | ||
} else if(attrs_num_sep === '.'){ | ||
return '.'; | ||
} | ||
return def_num_sep; | ||
} | ||
return def_num_sep; | ||
} | ||
function initIsPositive(attrs_num_pos, def_num_pos){ | ||
if(attrs_num_pos === 'false') { | ||
return false; | ||
} else if(attrs_num_pos === 'true') { | ||
return true; | ||
function initIsPositive(attrs_num_pos, def_num_pos){ | ||
if(attrs_num_pos === 'false') { | ||
return false; | ||
} else if(attrs_num_pos === 'true') { | ||
return true; | ||
} | ||
return def_num_pos; | ||
} | ||
return def_num_pos; | ||
} | ||
function initIsNegative(attrs_num_neg, def_num_neg){ | ||
if(attrs_num_neg === 'false') { | ||
return false; | ||
} else if(attrs_num_neg === 'true') { | ||
return true; | ||
function initIsNegative(attrs_num_neg, def_num_neg){ | ||
if(attrs_num_neg === 'false') { | ||
return false; | ||
} else if(attrs_num_neg === 'true') { | ||
return true; | ||
} | ||
return def_num_neg; | ||
} | ||
return def_num_neg; | ||
} | ||
function initRound(attrs_round, def_round){ | ||
if(attrs_round === 'floor') { | ||
return Math.floor; | ||
} else if(attrs_round === 'ceil') { | ||
return Math.ceil; | ||
} else if(attrs_round === 'round') { | ||
return Math.round; | ||
function initRound(attrs_round, def_round){ | ||
if(attrs_round === 'floor') { | ||
return Math.floor; | ||
} else if(attrs_round === 'ceil') { | ||
return Math.ceil; | ||
} else if(attrs_round === 'round') { | ||
return Math.round; | ||
} | ||
return def_round; | ||
} | ||
return def_round; | ||
} | ||
function buildRegexp(integerPart, fractionPart, fractionSeparator, isPositiveNumber, isNegativeNumber){ | ||
var negativeRegex = '-?'; | ||
if(isPositiveNumber === false && isNegativeNumber === true) { | ||
negativeRegex = '-'; | ||
} else if(isPositiveNumber === true && isNegativeNumber === false){ | ||
negativeRegex = ''; | ||
function buildRegexp(integerPart, fractionPart, fractionSeparator, isPositiveNumber, isNegativeNumber){ | ||
var negativeRegex = '-?'; | ||
if(isPositiveNumber === false && isNegativeNumber === true) { | ||
negativeRegex = '-'; | ||
} else if(isPositiveNumber === true && isNegativeNumber === false){ | ||
negativeRegex = ''; | ||
} | ||
var intRegex = '[0-9]{0,'+(integerPart)+'}'; | ||
if(integerPart === 0){ | ||
intRegex = '0'; | ||
} | ||
var fractRegex = '(\\'+fractionSeparator+'([0-9]){0,'+fractionPart+'})'; | ||
if(fractionPart === 0) { | ||
fractRegex = ''; | ||
} | ||
return new RegExp('^'+negativeRegex+intRegex+fractRegex+'?$'); | ||
} | ||
var intRegex = '[0-9]{0,'+(integerPart)+'}'; | ||
if(integerPart === 0){ | ||
intRegex = '0'; | ||
function removeLeadingZero(value){ | ||
return value.replace(/^0+/g, "").replace(/^-00+/g, "-0").replace(/-0+\[\.,]/, "-0$&").replace(/^[\.,]/g, "0$&"); | ||
} | ||
var fractRegex = '(\\'+fractionSeparator+'([0-9]){0,'+fractionPart+'})'; | ||
if(fractionPart === 0) { | ||
fractRegex = ''; | ||
function changeViewValue(ngModelController, value){ | ||
ngModelController.$viewValue = value; | ||
ngModelController.$render(); | ||
} | ||
return new RegExp('^'+negativeRegex+intRegex+fractRegex+'?$'); | ||
} | ||
function removeLeadingZero(value){ | ||
return value.replace(/^0+/g, "").replace(/^-00+/g, "-0").replace(/-0+\[\.,]/, "-0$&").replace(/^[\.,]/g, "0$&"); | ||
} | ||
function changeViewValue(ngModelController, value){ | ||
ngModelController.$viewValue = value; | ||
ngModelController.$render(); | ||
} | ||
function filterModelValue(value, fractionPart, fractionSeparator, roundFunction){ | ||
value = Number(value); | ||
if(!isNaN(value) && isFinite(value)) { | ||
var powerOfTen = Math.pow(10, fractionPart); | ||
return convModelToView(String(roundFunction(value*powerOfTen)/powerOfTen), fractionSeparator); | ||
function filterModelValue(value, fractionPart, fractionSeparator, roundFunction){ | ||
value = Number(value); | ||
if(!isNaN(value) && isFinite(value)) { | ||
var powerOfTen = Math.pow(10, fractionPart); | ||
return convModelToView(String(roundFunction(value*powerOfTen)/powerOfTen), fractionSeparator); | ||
} | ||
return "0"; | ||
} | ||
return "0"; | ||
} | ||
function dynamicNumberDirective() { | ||
return { | ||
restrict:'A', | ||
require: '?ngModel', | ||
scope: { | ||
numInt: "@", | ||
numFract: "@", | ||
numSep: "@", | ||
numPos: "@", | ||
numNeg: "@", | ||
numRound: "@" | ||
}, | ||
link: function(scope, element, attrs, ngModelController) { | ||
var integerPart = initIntegerPart(scope.numInt, 6); | ||
var fractionPart = initFractionPart(scope.numFract, 2); | ||
var fractionSeparator = initSeparator(scope.numSep, '.'); | ||
var isPositiveNumber = initIsPositive(scope.numPos, true); | ||
var isNegativeNumber = initIsNegative(scope.numNeg, true); | ||
var roundFunction = initRound(scope.numRound, Math.round); | ||
if(isPositiveNumber === false && isNegativeNumber === false) { | ||
throw new Error('Number is set to not be positive and not be negative. Change num_pos attr or/and num_neg attr to true'); | ||
} | ||
var viewRegexTest = buildRegexp(integerPart, fractionPart, fractionSeparator, isPositiveNumber, isNegativeNumber); | ||
ngModelController.$parsers.unshift(function(value){ | ||
var parsedValue = value; | ||
parsedValue = removeLeadingZero(parsedValue); | ||
if(parsedValue === '' && value.charAt(0)=== '0'){ | ||
changeViewValue(ngModelController, 0); | ||
return 0; | ||
function dynamicNumberDirective() { | ||
return { | ||
restrict:'A', | ||
require: '?ngModel', | ||
scope: { | ||
numInt: "@", | ||
numFract: "@", | ||
numSep: "@", | ||
numPos: "@", | ||
numNeg: "@", | ||
numRound: "@" | ||
}, | ||
link: function(scope, element, attrs, ngModelController) { | ||
var integerPart = initIntegerPart(scope.numInt, 6); | ||
var fractionPart = initFractionPart(scope.numFract, 2); | ||
var fractionSeparator = initSeparator(scope.numSep, '.'); | ||
var isPositiveNumber = initIsPositive(scope.numPos, true); | ||
var isNegativeNumber = initIsNegative(scope.numNeg, true); | ||
var roundFunction = initRound(scope.numRound, Math.round); | ||
if(isPositiveNumber === false && isNegativeNumber === false) { | ||
throw new Error('Number is set to not be positive and not be negative. Change num_pos attr or/and num_neg attr to true'); | ||
} | ||
if(parsedValue === undefined || parsedValue === ''){ | ||
return 0; | ||
} | ||
if(parsedValue === '-'){ | ||
changeViewValue(ngModelController, parsedValue); | ||
return 0; | ||
} | ||
var viewRegexTest = buildRegexp(integerPart, fractionPart, fractionSeparator, isPositiveNumber, isNegativeNumber); | ||
ngModelController.$parsers.unshift(function(value){ | ||
var parsedValue = value; | ||
parsedValue = removeLeadingZero(parsedValue); | ||
if(parsedValue === '' && value.charAt(0)=== '0'){ | ||
changeViewValue(ngModelController, 0); | ||
return 0; | ||
} | ||
if(parsedValue === undefined || parsedValue === ''){ | ||
return 0; | ||
} | ||
if(parsedValue === '-'){ | ||
changeViewValue(ngModelController, parsedValue); | ||
return 0; | ||
} | ||
/** | ||
* view value failed 'correct view format' test | ||
* therefore view value is set from last correct model value (it must be formatted - change dot to comma) | ||
*/ | ||
if(viewRegexTest.test(parsedValue) === false){ | ||
changeViewValue(ngModelController, convModelToView(ngModelController.$modelValue, fractionSeparator)); | ||
return ngModelController.$modelValue; | ||
} | ||
/** | ||
* view value success 'correct view format' test | ||
* therefore model value is set from correct view value (it must be formatter - change comma to dot) | ||
*/ | ||
else { | ||
changeViewValue(ngModelController, parsedValue); | ||
return convViewToModel(parsedValue, fractionSeparator); | ||
} | ||
}); | ||
/** | ||
* view value failed 'correct view format' test | ||
* therefore view value is set from last correct model value (it must be formatted - change dot to comma) | ||
* it is like filter, | ||
*/ | ||
if(viewRegexTest.test(parsedValue) === false){ | ||
changeViewValue(ngModelController, convModelToView(ngModelController.$modelValue, fractionSeparator)); | ||
return ngModelController.$modelValue; | ||
} | ||
/** | ||
* view value success 'correct view format' test | ||
* therefore model value is set from correct view value (it must be formatter - change comma to dot) | ||
*/ | ||
else { | ||
changeViewValue(ngModelController, parsedValue); | ||
return convViewToModel(parsedValue, fractionSeparator); | ||
} | ||
}); | ||
/** | ||
* it is like filter, | ||
*/ | ||
ngModelController.$formatters.push(function(value){ | ||
return filterModelValue(value, fractionPart, fractionSeparator, roundFunction); | ||
}); | ||
} | ||
}; | ||
} | ||
/** | ||
* filter does not validate data only filter fraction part and decimal separator | ||
*/ | ||
function dynamicNumberFilter(){ | ||
return function(value, numFract, numSep, numRound) { | ||
var fractionPart = initFractionPart(numFract, 2); | ||
var fractionSeparator = initSeparator(numSep, '.'); | ||
var roundFunction = initRound(numRound, Math.round); | ||
return filterModelValue(value, fractionPart, fractionSeparator, roundFunction); | ||
}; | ||
} | ||
angular.module('dynamicNumber',[]).directive('awnum', dynamicNumberDirective).filter('awnum', dynamicNumberFilter); | ||
ngModelController.$formatters.push(function(value){ | ||
return filterModelValue(value, fractionPart, fractionSeparator, roundFunction); | ||
}); | ||
} | ||
}; | ||
} | ||
/** | ||
* filter does not validate data only filter fraction part and decimal separator | ||
*/ | ||
function dynamicNumberFilter(){ | ||
return function(value, numFract, numSep, numRound) { | ||
var fractionPart = initFractionPart(numFract, 2); | ||
var fractionSeparator = initSeparator(numSep, '.'); | ||
var roundFunction = initRound(numRound, Math.round); | ||
return filterModelValue(value, fractionPart, fractionSeparator, roundFunction); | ||
}; | ||
} | ||
angular.module('dynamicNumber',[]).directive('awnum', dynamicNumberDirective).filter('awnum', dynamicNumberFilter); | ||
})(window,window.angular); |
@@ -1,1 +0,1 @@ | ||
"use strict";function convModelToView(e,n){return","===n?String(e).replace(".",","):e}function convViewToModel(e,n){return","===n?String(e).replace(",","."):e}function initIntegerPart(e,n){if(e>=0){var r=parseInt(e,10);if(isNaN(r)===!1&&isFinite(r)&&r>=0)return r}return n}function initFractionPart(e,n){if(e>=0){var r=parseInt(e,10);if(isNaN(r)===!1&&isFinite(r)&&r>=0)return r}return n}function initSeparator(e,n){return","===e?",":"."===e?".":n}function initIsPositive(e,n){return"false"===e?!1:"true"===e?!0:n}function initIsNegative(e,n){return"false"===e?!1:"true"===e?!0:n}function initRound(e,n){return"floor"===e?Math.floor:"ceil"===e?Math.ceil:"round"===e?Math.round:n}function buildRegexp(e,n,r,i,t){var u="-?";i===!1&&t===!0?u="-":i===!0&&t===!1&&(u="");var a="[0-9]{0,"+e+"}";0===e&&(a="0");var o="(\\"+r+"([0-9]){0,"+n+"})";return 0===n&&(o=""),new RegExp("^"+u+a+o+"?$")}function removeLeadingZero(e){return e.replace(/^0+/g,"").replace(/^-00+/g,"-0").replace(/-0+\[\.,]/,"-0$&").replace(/^[\.,]/g,"0$&")}function changeViewValue(e,n){e.$viewValue=n,e.$render()}function filterModelValue(e,n,r,i){if(e=Number(e),!isNaN(e)&&isFinite(e)){var t=Math.pow(10,n);return convModelToView(String(i(e*t)/t),r)}return"0"}function dynamicNumberDirective(){return{restrict:"A",require:"?ngModel",scope:{numInt:"@",numFract:"@",numSep:"@",numPos:"@",numNeg:"@",numRound:"@"},link:function(e,n,r,i){var t=initIntegerPart(e.numInt,6),u=initFractionPart(e.numFract,2),a=initSeparator(e.numSep,"."),o=initIsPositive(e.numPos,!0),c=initIsNegative(e.numNeg,!0),l=initRound(e.numRound,Math.round);if(o===!1&&c===!1)throw new Error("Number is set to not be positive and not be negative. Change num_pos attr or/and num_neg attr to true");var d=buildRegexp(t,u,a,o,c);i.$parsers.unshift(function(e){var n=e;return n=removeLeadingZero(n),""===n&&"0"===e.charAt(0)?(changeViewValue(i,0),0):void 0===n||""===n?0:"-"===n?(changeViewValue(i,n),0):d.test(n)===!1?(changeViewValue(i,convModelToView(i.$modelValue,a)),i.$modelValue):(changeViewValue(i,n),convViewToModel(n,a))}),i.$formatters.push(function(e){return filterModelValue(e,u,a,l)})}}}function dynamicNumberFilter(){return function(e,n,r,i){var t=initFractionPart(n,2),u=initSeparator(r,"."),a=initRound(i,Math.round);return filterModelValue(e,t,u,a)}}angular.module("dynamicNumber",[]).directive("awnum",dynamicNumberDirective).filter("awnum",dynamicNumberFilter); | ||
!function(n,r,t){"use strict";function e(n,r){return","===r?String(n).replace(".",","):n}function u(n,r){return","===r?String(n).replace(",","."):n}function i(n,r){if(n>=0){var t=parseInt(n,10);if(isNaN(t)===!1&&isFinite(t)&&t>=0)return t}return r}function o(n,r){if(n>=0){var t=parseInt(n,10);if(isNaN(t)===!1&&isFinite(t)&&t>=0)return t}return r}function a(n,r){return","===n?",":"."===n?".":r}function c(n,r){return"false"===n?!1:"true"===n?!0:r}function f(n,r){return"false"===n?!1:"true"===n?!0:r}function s(n,r){return"floor"===n?Math.floor:"ceil"===n?Math.ceil:"round"===n?Math.round:r}function m(n,r,t,e,u){var i="-?";e===!1&&u===!0?i="-":e===!0&&u===!1&&(i="");var o="[0-9]{0,"+n+"}";0===n&&(o="0");var a="(\\"+t+"([0-9]){0,"+r+"})";return 0===r&&(a=""),new RegExp("^"+i+o+a+"?$")}function l(n){return n.replace(/^0+/g,"").replace(/^-00+/g,"-0").replace(/-0+\[\.,]/,"-0$&").replace(/^[\.,]/g,"0$&")}function d(n,r){n.$viewValue=r,n.$render()}function p(n,r,t,u){if(n=Number(n),!isNaN(n)&&isFinite(n)){var i=Math.pow(10,r);return e(String(u(n*i)/i),t)}return"0"}function g(){return{restrict:"A",require:"?ngModel",scope:{numInt:"@",numFract:"@",numSep:"@",numPos:"@",numNeg:"@",numRound:"@"},link:function(n,r,g,v){var h=i(n.numInt,6),w=o(n.numFract,2),N=a(n.numSep,"."),$=c(n.numPos,!0),M=f(n.numNeg,!0),b=s(n.numRound,Math.round);if($===!1&&M===!1)throw new Error("Number is set to not be positive and not be negative. Change num_pos attr or/and num_neg attr to true");var F=m(h,w,N,$,M);v.$parsers.unshift(function(n){var r=n;return r=l(r),""===r&&"0"===n.charAt(0)?(d(v,0),0):r===t||""===r?0:"-"===r?(d(v,r),0):F.test(r)===!1?(d(v,e(v.$modelValue,N)),v.$modelValue):(d(v,r),u(r,N))}),v.$formatters.push(function(n){return p(n,w,N,b)})}}}function v(){return function(n,r,t,e){var u=o(r,2),i=a(t,"."),c=s(e,Math.round);return p(n,u,i,c)}}r.module("dynamicNumber",[]).directive("awnum",g).filter("awnum",v)}(window,window.angular); |
213
13993