From 0bdf31a7e177fefb12b3edabf97ca6d22b7ad268 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Wed, 8 Feb 2023 18:29:14 +0300 Subject: [PATCH] added Number utils... Signed-off-by: Alex A. Naanou --- Number.js | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++ main.js | 1 + package.json | 2 +- 3 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 Number.js diff --git a/Number.js b/Number.js new file mode 100644 index 0000000..ad6b309 --- /dev/null +++ b/Number.js @@ -0,0 +1,103 @@ +/********************************************************************** +* +* +**********************************************/ /* c8 ignore next 2 */ +((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define) +(function(require){ var module={} // make module AMD/node compatible... +/*********************************************************************/ + +var object = require('ig-object') + + +//--------------------------------------------------------------------- + +var NumberMixin = +module.NumberMixin = +object.Mixin('NumberMixin', 'soft', { + toAlpha: function(n, alpha='abcdefghijklmnopqrstuvwxyz'){ + var res = '' + var base = alpha.length + do{ + res = alpha[n % base] + res + n = Math.floor(n/base) - 1 + }while(n >= 0) + return res }, + fromAlpha: function(str, alpha='abcdefghijklmnopqrstuvwxyz'){ + var res = 0 + var base = alpha.length + var i = 0 + for(var c of [...str].reverse()){ + var val = alpha.indexOf(c) + 1 + res += val * (base ** i++) } + return res-1 }, + + toRoman: function(n){ + var index = { + M: 1000, + CM: 900, + D: 500, + CD: 400, + C: 100, + XC: 90, + L: 50, + XL: 40, + X: 10, + IX: 9, + V: 5, + IV: 4, + I: 1, + } + var res = '' + for(var R in index){ + while(n >= index[R]){ + res += R + n -= index[R] } } + return res }, + fromRoman: function(str){ + var index = { + M: 1000, + CM: 900, + D: 500, + CD: 400, + C: 100, + XC: 90, + L: 50, + XL: 40, + X: 10, + IX: 9, + V: 5, + IV: 4, + I: 1, + } + var n = 0 + str = str.toUpperCase() + while(str != ''){ + if(str.slice(0, 2) in index){ + n += index[str.slice(0, 2)] + str = str.slice(2) + } else if(str[0] in index){ + n += index[str[0]] + str = str.slice(1) + } else { + throw new Error('fromRoman(..): Unknown sequence: '+ str) } } + return n }, +}) + +NumberMixin(Number) + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +var NumberProtoMixin = +module.NumberProtoMixin = +object.Mixin('NumberProtoMixin', 'soft', { + toAlpha: function(alpha='abcdefghijklmnopqrstuvwxyz'){ + return this.constructor.toAlpha(this, alpha) }, + toRoman: function(n){ + return this.constructor.toRoman(this) }, +}) + +NumberProtoMixin(Number.prototype) + + + +/********************************************************************** +* vim:set ts=4 sw=4 nowrap : */ return module }) diff --git a/main.js b/main.js index c30b6f1..4b26ba4 100644 --- a/main.js +++ b/main.js @@ -10,6 +10,7 @@ var object = require('ig-object') // Extend built-in types... +require('./Number') require('./Object') require('./Array') require('./Set') diff --git a/package.json b/package.json index 3a58dbd..b97070d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ig-types", - "version": "6.25.4", + "version": "6.26.0", "description": "Generic JavaScript types and type extensions...", "main": "main.js", "scripts": {