added Number utils...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2023-02-08 18:29:14 +03:00
parent 11d5650cae
commit 0bdf31a7e1
3 changed files with 105 additions and 1 deletions

103
Number.js Normal file
View File

@ -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 })

View File

@ -10,6 +10,7 @@
var object = require('ig-object')
// Extend built-in types...
require('./Number')
require('./Object')
require('./Array')
require('./Set')

View File

@ -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": {