【问题标题】:Convert string of time to cleaner format将时间字符串转换为更清晰的格式
【发布时间】:2015-11-03 00:04:46
【问题描述】:

通常有一些神奇的方法可以在 javascript 中做某事。

以字符串为例

10h49m02s

并希望将其转换为

10 hours, 49 minutes, 2 seconds

同时避免空的小时/分钟/秒

eg2

00h10m20s

这就是我正在做的事情,这可能很有趣

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

【问题讨论】:

  • 有问题吗?您可以使用各种方法来解析字符串,例如正则表达式,但是您的标记化然后处理方法基本上是可以的。不过,您可以提高效率。
  • 抱歉,我的问题应该包括一个问题 - 我真的在寻找一个正则表达式,但不知道如何开始

标签: javascript regex string time


【解决方案1】:

您实际上可以使用正则表达式来匹配您的值,并将 hms 替换为扩展词,前提是捕获的文本不是零,如下所示:

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);

正则表达式 - \b0*(\d{1,2})h0*(\d{1,2})m0*(\d{1,2})s\b - 匹配:

  • \b - 字边界
  • 0* - 0 个或多个前导零
  • (\d{1,2}) - 小时,1 或 2 位数字
  • h0* - h 字面意思和 0 个或多个零
  • (\d{1,2}) - 分钟,1 或 2 位数字
  • m0* - m 字面意思和 0 个或多个零
  • (\d{1,2}) - 秒,1 或 2 位数字
  • s\b - s 在“单词”的末尾。

【讨论】:

  • 谢谢,正则表达式非常强大
  • 它们在与特定语言的 RegExp 方法一起使用时更加强大,在这种情况下,func 回调函数值得关注。它可以很好地操纵替换过程。
【解决方案2】:

类似于 stribizhev 的答案,但使用了更简单的正则表达式。我使用了 reduce,但 for 循环不再是代码,而且可能会更快:

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'));

【讨论】:

  • 谢谢,以前从未见过 reduce。真是有趣的方法。不明白if(+p)
  • p 是一个字符串,一元 + 运算符将其转换为数字,因此如果它转换为零或 NaN(例如它是 "h"),则 push 步骤被跳过。
猜你喜欢
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2016-02-19
相关资源
最近更新 更多