You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.3 KiB
80 lines
2.3 KiB
/*jshint node:true */ |
|
|
|
"use strict"; |
|
|
|
var minimalDesc = ['h', 'min', 's', 'ms', 'μs', 'ns']; |
|
var verboseDesc = ['hour', 'minute', 'second', 'millisecond', 'microsecond', 'nanosecond']; |
|
var convert = [60*60, 60, 1, 1e6, 1e3, 1]; |
|
|
|
module.exports = function (source, opts) { |
|
var verbose, precise, i, spot, sourceAtStep, valAtStep, decimals, strAtStep, results, totalSeconds; |
|
|
|
verbose = false; |
|
precise = false; |
|
if (opts) { |
|
verbose = opts.verbose || false; |
|
precise = opts.precise || false; |
|
} |
|
|
|
if (!Array.isArray(source) || source.length !== 2) { |
|
return ''; |
|
} |
|
if (typeof source[0] !== 'number' || typeof source[1] !== 'number') { |
|
return ''; |
|
} |
|
|
|
// normalize source array due to changes in node v5.4+ |
|
if (source[1] < 0) { |
|
totalSeconds = source[0] + source[1] / 1e9; |
|
source[0] = parseInt(totalSeconds); |
|
source[1] = parseFloat((totalSeconds % 1).toPrecision(9)) * 1e9; |
|
} |
|
|
|
results = ''; |
|
|
|
// foreach unit |
|
for (i = 0; i < 6; i++) { |
|
spot = i < 3 ? 0 : 1; // grabbing first or second spot in source array |
|
sourceAtStep = source[spot]; |
|
if (i !== 3 && i !== 0) { |
|
sourceAtStep = sourceAtStep % convert[i-1]; // trim off previous portions |
|
} |
|
if (i === 2) { |
|
sourceAtStep += source[1]/1e9; // get partial seconds from other portion of the array |
|
} |
|
valAtStep = sourceAtStep / convert[i]; // val at this unit |
|
if (valAtStep >= 1) { |
|
if (verbose) { |
|
valAtStep = Math.floor(valAtStep); // deal in whole units, subsequent laps will get the decimal portion |
|
} |
|
if (!precise) { |
|
// don't fling too many decimals |
|
decimals = valAtStep >= 10 ? 0 : 2; |
|
strAtStep = valAtStep.toFixed(decimals); |
|
} else { |
|
strAtStep = valAtStep.toString(); |
|
} |
|
if (strAtStep.indexOf('.') > -1 && strAtStep[strAtStep.length-1] === '0') { |
|
strAtStep = strAtStep.replace(/\.?0+$/,''); // remove trailing zeros |
|
} |
|
if (results) { |
|
results += ' '; // append space if we have a previous value |
|
} |
|
results += strAtStep; // append the value |
|
// append units |
|
if (verbose) { |
|
results += ' '+verboseDesc[i]; |
|
if (strAtStep !== '1') { |
|
results += 's'; |
|
} |
|
} else { |
|
results += ' '+minimalDesc[i]; |
|
} |
|
if (!verbose) { |
|
break; // verbose gets as many groups as necessary, the rest get only one |
|
} |
|
} |
|
} |
|
|
|
return results; |
|
};
|
|
|