从'1y2m3d'、'2m3d'、'1y3d'、'1y'或'3d'等字符串计算天数
Calculate number of days from string like '1y2m3d', '2m3d', '1y3d', '1y' or simply '3d'
我想在 javascript 中为我的网格创建一些过滤系统。我的问题是我有一个包含年数、月数和天数的字符串。我想将此字符串转换为天数格式。 IE。 1y1m2d = 1*365+1*30+2
、1y2d = 1*365+2
或类似的其他组合。
我不确定如何处理这个问题。我试图为此创建一个正则表达式,但是我不知道如何区分组是年份还是月份等等。
正则表达式看起来像这样 - /(\d+y)?(\d+m)?(\d+d)?/
但是对于这个解决方案,问题是我无法知道组是否是年、月等。
我尝试的第二个解决方案是使用 .replace
然后通过 math.eval()
传递它,但事实证明这对我不起作用,我不确定为什么。
let result = stringFormat.replace(/y|m|d/, function (x) {
return x === 'y' ? '*365' : x === 'm' ? '*12' : '*30';
});
你怎么看这件事?这里最好的方法是什么?谢谢。
你可以使用
const stringFormat = '1y1m2d';
let result = stringFormat.replace(/[ymd]/g, function (x, index, source) {
return (x === 'y' ? '*365' : x === 'm' ? '*30' : '')+(index !== source.length-1 ? '+' : '');
});
console.log(result) // => 1*365+1*30+2
备注:
/[ymd]/g
匹配字符串 中出现的所有 y
或 m
或 d
- 回调函数中使用了三个参数:
x
代表匹配值,index
是开始匹配位置,source
是输入字符串值
- 如果匹配到
y
,则替换为*360
,如果匹配不在字符串末尾,则替换为+
,如果匹配到m
,则替换是*30
和+
,如果匹配到d
,则不加乘数。
(index !== source.length-1 ? '+' : '')
检查匹配是否在字符串的末尾,并在必要时添加 +
。它是这样工作的,因为匹配始终是单个字符。
我想在 javascript 中为我的网格创建一些过滤系统。我的问题是我有一个包含年数、月数和天数的字符串。我想将此字符串转换为天数格式。 IE。 1y1m2d = 1*365+1*30+2
、1y2d = 1*365+2
或类似的其他组合。
我不确定如何处理这个问题。我试图为此创建一个正则表达式,但是我不知道如何区分组是年份还是月份等等。
正则表达式看起来像这样 - /(\d+y)?(\d+m)?(\d+d)?/
但是对于这个解决方案,问题是我无法知道组是否是年、月等。
我尝试的第二个解决方案是使用 .replace
然后通过 math.eval()
传递它,但事实证明这对我不起作用,我不确定为什么。
let result = stringFormat.replace(/y|m|d/, function (x) {
return x === 'y' ? '*365' : x === 'm' ? '*12' : '*30';
});
你怎么看这件事?这里最好的方法是什么?谢谢。
你可以使用
const stringFormat = '1y1m2d';
let result = stringFormat.replace(/[ymd]/g, function (x, index, source) {
return (x === 'y' ? '*365' : x === 'm' ? '*30' : '')+(index !== source.length-1 ? '+' : '');
});
console.log(result) // => 1*365+1*30+2
备注:
/[ymd]/g
匹配字符串 中出现的所有 - 回调函数中使用了三个参数:
x
代表匹配值,index
是开始匹配位置,source
是输入字符串值 - 如果匹配到
y
,则替换为*360
,如果匹配不在字符串末尾,则替换为+
,如果匹配到m
,则替换是*30
和+
,如果匹配到d
,则不加乘数。 (index !== source.length-1 ? '+' : '')
检查匹配是否在字符串的末尾,并在必要时添加+
。它是这样工作的,因为匹配始终是单个字符。
y
或 m
或 d