我正在寻找一个仅接受负 / 正值且带有小数和预定义(在数组中)的输入字段在输入的末尾>单位。
可接受的示例值为:
var inputValue = "150px"; <---- This could be anything (from the input).
var units = ["px", "em", "%"];
var defaultUnit = "px";
100px, 100em, 100%
-100px, -100em, -100%
-100.50px, -100.50em, -100.50%
最后,我需要将“ unit”和值保存在变量中。如果用户未提供单位,那么我应该将默认值(px)指定为单位。
var value = 100;
var unit = %;
我想不出以纯JavaScript 或ES15方式完成所有这些操作的方法。谁能指导我?
答案 0 :(得分:1)
使用regex match operation可以做到:
function splitToValueAndUnit(string) {
if(!string) {
return { value: "", unit: "px" };
}
string = string.toString();
var value = string.match(/[+-]?\d*[.]?\d*/)[0];
var unit = string.replace(value, "")
return {
value: value,
unit: unit || "px"
}
}
console.log(splitToValueAndUnit("123px"))
console.log(splitToValueAndUnit("123%"))
console.log(splitToValueAndUnit("123"))
console.log(splitToValueAndUnit("-123"))
console.log(splitToValueAndUnit("-123px"))
console.log(splitToValueAndUnit("-123.099%"))
console.log(splitToValueAndUnit(""))
console.log(splitToValueAndUnit())
console.log(splitToValueAndUnit(123))
console.log(splitToValueAndUnit(undefined))
答案 1 :(得分:0)
使用正则表达式
const rx = /(-?[\d\.]+)(.*)/
//Group 1. optional negative sign, then digits or digits.digits
//Group 2. unit
const data = ['10px', '11.12in', '-4%']
data.forEach(it => {
const m = rx.exec(it)
if (m) {
const parsed = {
value: parseFloat(m[1]),
unit: m[2]
}
console.log(it, parsed)
}
})
您可以巩固数字的正则表达式以拒绝多个.
字符,但这只是一个简单的演示。 parseFloat函数也将捕获它。