mathjs/lib/type/numeric.js

51 lines
1.4 KiB
JavaScript

'use strict';
function factory(type, config, load, typed) {
// TODO: expose this function to mathjs, add documentation
/**
* Create a numeric value with a specific type: number, BigNumber, or Fraction
*
* @param {string | number} value
* @param {'number' | 'BigNumber' | 'Fraction'}
* @return {number | BigNumber | Fraction} Returns an instance of the
* numeric requested type
*/
return function numeric (value, valueType) {
if (valueType === 'BigNumber') {
return new type.BigNumber(value);
}
else if (valueType === 'Fraction') {
return new type.Fraction(value);
}
else {
// valueType === 'number' or undefined // TODO: check this
if (typeof value === 'number') {
return value;
}
else {
if (value === 'Infinity') {
return Infinity;
}
if (value === 'NaN') {
return NaN;
}
// The following regexp is relatively permissive
if (!/^[\-+]?((\d+\.?\d*)|(\d*\.?\d+))([eE][+\-]?\d+)?$/.test(value)) {
throw new Error('Invalid numeric value "' + value + '"');
}
// remove leading zeros like '003.2' which are not allowed by JavaScript
return parseFloat(value.replace(/^(0*)[0-9]/, function (match, zeros) {
return match.substring(zeros.length);
}));
}
}
}
}
exports.factory = factory;