我有一个计时器应用程序,它计算经过的时间(以毫秒为单位),将其转换为格式化的字符串,然后显示出来。在其他地方,我有一个函数可以将相同的字符串转换为毫秒,以便执行其他一些数学运算。我知道,这似乎违反直觉,但大多数情况下都是有效的。
无论如何,此函数需要一个字符串,如14.55(14秒和约550毫秒),并以毫秒为单位返回时间,但操作不正确。
function toMS(str) {
if(str.includes(":")) {
const [mins, secms] = str.split(":");
const [sec, ms] = secms.split(".");
return ((+mins * 60) + +sec) * 1000 + +ms;
} else {
const [sec, ms] = str.split(".");
return (+sec) * 1000 + +ms;
}
}
如果我输入类似10.77的值,它将返回10077,而不是应有的10770。怎么了?
答案 0 :(得分:3)
为什么不使用parseFloat?
function toMS(str) {
if(str.includes(":")) {
const [mins, secms] = str.split(":");
const sec = parseFloat(secms);
return ((+mins * 60) + sec) * 1000;
} else {
return parseFloat(str) * 1000;
}
}
答案 1 :(得分:0)
0.1秒等于100毫秒,而不是1毫秒。请记住,0.1秒也可以写为1/10秒1/10 * 1000ms = 100ms
。
这意味着您必须将小数部分乘以100才能获得正确的结果。
function toMS(str) {
if(str.includes(":")) {
const [mins, secms] = str.split(":");
const [sec, ms] = secms.split(".");
return ((+mins * 60) + +sec) * 1000 + +ms;
} else {
const [sec, ms] = str.split(".");
return (+sec) * 1000 + ms * 100;
}
}
注意:您不需要+
来转换变量,因为*
足以将其强制转换为number
。
您还可以通过以下方式应用DRY原理:
function toMS(str) {
let mins = 0;
if(str.includes(":")) {
[mins, str] = str.split(":");
}
const [sec, ms] = str.split(".");
return mins * 60000 + sec * 1000 + ms * 100;
}
答案 2 :(得分:0)
如果您担心使用parseFloat
解决方案舍入错误,那么这里是一个纯字符串实现:
ms = +(ms.concat("00").substring(0,3));
那么,我们在做什么?
在毫秒字符串中添加“ 0”。我们用2个零填充以适应以下情况:
a。超过3位数字-在这种情况下,所有填充的零将在以后被忽略
b。正好有3位数字-所有填充的零将在以后被忽略
c。正好有2位数字-多余的零将被忽略
d。正好有1位数字-都需要两个零 e。完全没有数字-后面的两个零都将转换为0
我们仅使用前3位数字。这将自动忽略任何额外零的情况,以及是否意外以比所需精度更高的精度指定了ms(例如,如果有人输入1.1234)
我们使用一元+
运算符