【问题标题】:Negative/positive values with decimals and units带小数和单位的负/正值
【发布时间】:2019-07-21 05:22:28
【问题描述】:

我正在寻找一个输入字段,它只接受 negative/positive 值与 decimals 和预定义(在数组中)单位在输入的末尾。

可接受的示例值为:

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%

最后,我需要保存“单位”和变量中的值。如果用户没有提供单位我那么我应该分配默认值(px)作为单位。

var value = 100;
var unit = %;

我想不出用 纯 javascript 或 ES15 方式完成所有这些工作的方法。谁能指导我?

【问题讨论】:

    标签: javascript html arrays validation vue.js


    【解决方案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))

    【讨论】:

    • 太棒了。一些乱七八糟的文字怎么办?那么我更喜欢单位为“-”,数值为空白。
    • 更新正则表达式以匹配数字和十进制值前面的 -/+ 符号
    【解决方案2】:

    使用正则表达式

    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 函数也会捕获它。

    【讨论】:

    • 我只想将正则表达式设为const rx = /(-?)([\d\.]+)(em|px|%)/,因此它也排除了无效/预期的单位。
    • 我希望在eval 之后检查开关中的单位,以便您可以报告无效单位及其内容,或者使用默认值。
    • 做了一些改动并按预期工作。谢谢@StevenSpungin jsfiddle.net/minuwan/phmyj73d
    • @stackminu 不错。执行units.find(it=&gt;it===m[2]) || 'px' 过滤掉坏单元
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多