如何确保parseInt()函数不会返回意外结果

时间:2015-08-10 02:46:46

标签: javascript jquery function parseint

以下是将毫秒转换为人类可读时间的方法。但是我得到了一个评论,说它可能会返回一些基数的意外结果。

function msToTime(duration, sign) {
  var milliseconds = parseInt((duration % 1000) / 100),
    seconds = parseInt((duration / 1000) % 60),
    minutes = parseInt((duration / (1000 * 60)) % 60),
    hours = parseInt((duration / (1000 * 60 * 60)) % 24);

  hours = (hours < 10) ? "0" + hours : hours;
  minutes = (minutes < 10) ? " " + minutes : minutes;
  seconds = (seconds < 10) ? "0" + seconds : seconds;

  return minutes + sign + seconds;
}

$("div").text(msToTime(1203400, ":"));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div></div>

这是我收到的评论:“如果未提供基数,parseInt()函数可以返回不需要的和/或意外的结果。请确保在所有{{1}上使用基数实例。“

我试图添加日,周,月,年等等,但我不确定这是否正确。它也是音乐的持续时间。所以我认为不会有超过几个小时的情况。

是否有任何想法确保方法的结果始终正确?

3 个答案:

答案 0 :(得分:2)

parseInt()将第二个名为radix的参数作为其第二个参数

  

2到36之间的一个整数,表示基数(基数为   数字数字系统)上面提到的字符串。指定   10为人类常用的十进制数字系统。总是   指定此参数以消除读者的困惑并保证   可预测的行为。不同的实现产生不同   未指定基数时的结果。

由于您正在处理十进制数字系统,请将基数传递为10以解决此类问题

parseInt((duration % 1000) / 100, 10)

答案 1 :(得分:1)

Radix是parseInt()所采用的第二个参数,它是一个数字(从2到36),表示要使用的数字系统。您应该使用10,因为它代表十进制数字系统。

var milliseconds = (parseInt(duration) % 1000) / 100, 10)

如果没有传递基数,将使用以下内容:

  

如果字符串以&#34; 0x&#34;开头,则基数为16(十六进制)。

     

如果字符串以&#34; 0&#34;开头,则基数为8(八进制)。这个功能是   已弃用

     

如果字符串以任何其他值开头,则基数为10   (十进制)

如果您不想总是指定它,请创建如下函数:

function parseInt10(val){
    return parseInt(val,10);
}

答案 2 :(得分:0)

其他答案提供了一些关于parseInt()的建议,这些建议在技术上是正确的,但与您的实际代码无关,因为您甚至不需要在函数中使用parseInt()

由于您似乎已经将一个数字(不是字符串)传递到您的函数中,您甚至不需要任何parseInt()操作,并且可以像这样简化它:

function msToTime(duration, sign) {
  var milliseconds = (duration % 1000) / 100,
    seconds = (duration / 1000) % 60,
    minutes = (duration / (1000 * 60)) % 60,
    hours = (duration / (1000 * 60 * 60)) % 24;

  hours = (hours < 10) ? "0" + hours : hours;
  minutes = (minutes < 10) ? " " + minutes : minutes;
  seconds = (seconds < 10) ? "0" + seconds : seconds;

  return minutes + sign + seconds;
}

如果你希望你的函数接受一段时间内传入的数字或字符串,你可以这样支持:

function msToTime(t, sign) {
  var duration = +t;
  var milliseconds = (duration % 1000) / 100,
    seconds = (duration / 1000) % 60,
    minutes = (duration / (1000 * 60)) % 60,
    hours = (duration / (1000 * 60 * 60)) % 24;

  hours = (hours < 10) ? "0" + hours : hours;
  minutes = (minutes < 10) ? " " + minutes : minutes;
  seconds = (seconds < 10) ? "0" + seconds : seconds;

  return minutes + sign + seconds;
}

而且,如果您使用parseInt(),则会将持续时间转换为数字:

var d = parseInt(duration, 10);

然后,在计算中使用该值。正如您的代码现在所说的那样,您在数学计算结果上调用了parseInt(),这意味着您在一个没有做任何事情的数字上调用parseInt