Examples:
// pass in integer or floating point.
-> PurdyPercent(27.0)
-> "27%"
// pass in numerator and denominator
-> PurdyPercent([5.424, 28])
-> "19.37%"
// set decimal places to three
-> PurdyPercent(38.43895, {decimals: 3})
-> "38.438%"
var PurdyPercent = function (num, options) { | |
this.settings = { | |
hide_decimal_on_whole : true, | |
decimals : 2, | |
truncate : false, // (soon) | |
match_decimals: true, // forces floats to match defined decimal count | |
postfix : '%' | |
}; | |
// helper methods | |
this.extend = function(destination, source) { | |
for (var property in source) { | |
if (source.hasOwnProperty(property)) { | |
destination[property] = source[property]; | |
} | |
} | |
return destination; | |
}; | |
this.is_float = function () { | |
this.modulus = this.num % 1; | |
this.root = parseInt(this.num, 10); | |
return this.modulus % 1 != 0; | |
}; | |
this.set_decimals = function () { | |
var factor = Math.pow(10,this.settings.decimals); | |
this.value = Math.round(this.num*factor)/factor; | |
if (this.settings.match_decimals) this.match_decimals(); | |
}; | |
this.match_decimals = function () { | |
var fraction = this.fraction(), | |
length = fraction.length, | |
diff = this.settings.decimals - length; | |
if (diff > 0) { | |
for (var i = diff - 1; i >= 0; i--) { | |
fraction = fraction + '0'; | |
} | |
} else if (diff < 0) { | |
diff = Math.abs(diff); | |
for (var i = diff - 1; i >= 0; i--) { | |
fraction = fraction.slice(0, -1); | |
} | |
} | |
this.value = [this.root, fraction].join('.'); | |
}; | |
this.fraction = function () { | |
return this.num.toString().split('.')[1]; | |
}; | |
// logic | |
if (num instanceof Array) { | |
this.numerator = parseFloat(num[0]); | |
this.denominator = parseFloat(num[1]); | |
this.num = (this.numerator / this.denominator) * 100.0; | |
} else { | |
this.num = parseFloat(num); | |
} | |
this.extend(this.settings, options || {}); | |
if (this.is_float()) { | |
this.set_decimals(); | |
} else { | |
if (this.settings.hide_decimal_on_whole) { | |
this.value = parseInt(this.num, 10); | |
} else { | |
this.value = this.num; | |
} | |
} | |
return [this.value, this.settings.postfix].join(''); | |
}; |