Home > Enterprise >  Best way to compare number sizes where one is in form of 30k
Best way to compare number sizes where one is in form of 30k

Time:01-05

Is there a standard way in JavaScript to easily compare two numbers where one or both can be in the form 32k. For example:

32k > 310
2.5k > 450
300 > 200
2.5m > 2.5k

So that you can easily find the max value of an array that could contain [300,3k,3.2k]. I could try to create my own function to do this, but I wondered if there is a standard way to do this? Thanks

CodePudding user response:

If you have 'k', or 'm', then the "number" is actually a string object, so you would need to parse out the number before you could do a comparison. Since you are only looking for the max value, a simple loop, parse, convert, and compare should be sufficient. Here is an example that supports 'k', 'm', 'b', 't' (case insensitive).

//Using a simple object for fast lookups of mutliplier.
const abvMap = {
  'k': 1000,
  'm': 1000000,
  'b': 1000000000,
  't': 1000000000000
};

function getMaxIndex(numArray) {
  if (!numArray || !Array.isArray(numArray) || numArray.length === 0) {
    throw 'invalid input';
  }

  //Start with the first number being the 
  let maxValue = parseNumber(numArray[0]);
  let maxIdx = 0;

  for (let i = 1, len = numArray.length; i < len; i  ) {
    let num = parseNumber(numArray[i]);

    if (num > maxValue) {
      maxValue = num;
      maxIdx = i;
    }
  }

  return maxIdx;
}

function parseNumber(numString) {
  //Check to see if input is a number already. If so, return it.
  if (typeof numString === 'number') {
    return numString;
  }

  //Capture the number by removing any letters, $ sign (make it more reusable)
  let num = parseFloat(numString.replace(/[a-zA-Z$]/gi, ''));

  //Capture the number abbreviation. 
  let abv = numString.replace(/[-$\d.\s]*/gi, '');

  if (abv) {
    //Normalize abbreviation.
    abv = abv.toLowerCase();

    //Get the multiplier.
    let multiplier = abvMap[abv];

    if (multiplier) {
      //Multiply the value accordingly.
      return num * multiplier;
    }
  }

  return num;
}

function getMaxValue(numArray) {
  //Get the index of the max value, then return that value from the array.
  return numArray[getMaxIndex(numArray)];
}

//Test array of mixed number values.
var myArray = ['300', '3k', '3.2k', '0.0001k', '$15', '$30k', 1000];


document.body.innerHTML = getMaxValue(myArray);

If you want to support more

  • Related