BarryBones41
BarryBones41

Reputation: 1491

Convert string of time to cleaner format

There's usually some magical way to do something in javascript.

Take for example the string

10h49m02s

and wanting to convert it to

10 hours, 49 minutes, 2 seconds

while avoid empty hours/minutes/seconds

eg2

00h10m20s

This is what I'm doing which is probably hilarious

var arr = time.split('');
var hourMaj = arr[0];
var hourMin = arr[1];
var minMaj = arr[3];
var minMin = arr[4];
var secMaj = arr[6];
var secMin = arr[7];

var str = "";

if(hourMaj !== '0'){
   str += hourMaj;
   str += hourMin;
}else if (hourMin !== '0'){
  str += hourMin;
}
if(hourMaj !== '0' || hourMin !== '0')
  str += "hours, ";

... and on

Upvotes: 2

Views: 59

Answers (2)

RobG
RobG

Reputation: 147523

Similar to stribizhev's answer, but with a much simpler regular expression. I've used reduce but a for loop is no more code and would probably be faster:

function parseTime(s) {

  // Match sequences of numbers or letters
  var b = s.match(/\d+|[a-z]+/gi);
  var words = {h:'hour', m:'minute', s:'second'};
  var result;

  // If some matches found
  if (b) {

    // Do replacement
    result = b.reduce(function(acc, p, i) {

      // Only include values that aren't zero
      // and skip letters - +p => NaN
      if (+p) {

        // Change letters to words, add plural and store in array
         acc.push(+p + words[b[i+1]] + (p==1? '' : 's'));
      }

      // Pass the accumulator array to the next iteration
      return acc;
    },[])
  }

  // Format the result
  return result.join(', ');
}

document.write(parseTime('00h00m02s') + '<br>');
document.write(parseTime('10h40m02s') + '<br>');
document.write(parseTime('10h00m51s') + '<br>');
document.write(parseTime('01h32m01s'));

Upvotes: 2

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627536

You can actually use a regex to match your values and replace h, m and s with expanded words only if the captured texts are not zeros, like this:

var re = /\b0*(\d{1,2})h0*(\d{1,2})m0*(\d{1,2})s\b/g; 
var str = '10h49m02s';
var str2 = '00h10m20s';

function func(match, h, m, s) {
  var p = '';
  if (h !== '0') {
    p += h + " hours"
  }
  if (m !== '0') {
    p += (p.length > 0 ? ", " : "") + m + " minutes"
  }
  if (s !== '0') {
    p += (p.length > 0 ? ", " : "") + s + " seconds"
  }
  return p;
}

var res = str.replace(re, func);
document.write(res + "<br/>");
res = str2.replace(re, func);
document.write(res);

The regex - \b0*(\d{1,2})h0*(\d{1,2})m0*(\d{1,2})s\b - matches:

  • \b - word boundary
  • 0* - 0 or more leading zeros
  • (\d{1,2}) - hours, 1 or 2 digits
  • h0* - h literally and 0 or more zeros
  • (\d{1,2}) - minutes, 1 or 2 digits
  • m0* - m literally and 0 or more zeros
  • (\d{1,2}) - seconds, 1 or 2 digits
  • s\b - s at the end of the "word".

Upvotes: 2

Related Questions