【问题标题】:Update all numbers in string with JavaScript?用 JavaScript 更新字符串中的所有数字?
【发布时间】:2017-01-18 20:02:00
【问题描述】:

主要问题是如何更新字符串中的所有数字?

我要更新字符串中数字的示例:

  • -ms-transform: rotate(7deg);
  • margin: 10px 20px 30px 40px;
  • Value10isMoreThan5

所以每个数字“块”都应该单独处理(例如101 01px2,无论数字段之间是空格还是字符)。

当我使用空格分割字符串时,我得到了这个工作,但在字符串没有空格rotate(7deg) 的情况下它不起作用。这是一小段“意大利面条代码”示例。

// Basic lerp
function lerp (min, max, amount) {
    return min + amount * (max - min);
}

// Lerp values in string
function lerpAllNumbers (a, b, amount) {
    var aNumbers = separateNumbers(a);
    var bNumbers = separateNumbers(b);
    var returnValue = null;
    if (aNumbers.length === bNumbers.length) {
        for (var i = 0; i < aNumbers.length; i++) {
            var searchString = aNumbers[i].value + aNumbers[i].extension;
            var newValue = lerp(aNumbers[i].value, bNumbers[i].value, amount).toFixed(3) + aNumbers[i].extension;
            returnValue = a.toString().replace(searchString, newValue);
        }
        return returnValue;
    }
}

// Separate numbers from string and create object with value and extension
function separateNumbers(text) {
    var splitter = text.toString().split(" ");
    var returnArray = [];
    splitter.forEach(function(item){
        var numberObj = {
            value: parseFloat(item),
            extension: item.replace(/^-?\d+((.|,)\d+)?/g, '')
        }
        returnArray.push(numberObj);
    });
    return returnArray;
}

如有重复,请见谅。我已经找到了这样一个有用的帖子:regex to split number from string

但在这种情况下,我需要更新多个数字并在更新后将它们放回正确位置的字符串。

是否有更智能/更简单的方法来使用 JavaScript(Vanilla 或 jQuery)更新字符串中的所有数字?

【问题讨论】:

标签: javascript jquery string numbers


【解决方案1】:

您需要使用带有匿名回调方法的String#replace

// Basic lerp
function lerp (min, max, amount) {
    return Number(min + amount * (max - min));
}

var s = "-ms-transform: rotate(7deg);";
var max = 15, amount = 2;
console.log(
  s.replace(/-?\d*[,.]?\d+/g, function(m) {
    return lerp(Number(m), max, amount).toFixed(3);
  })
);

该模式是/-?\d*[,.]?\d+/g,它匹配多次出现的可选减号、0+ 位、,.,然后是 1+ 位。

function(m){} 是作为替换参数传递给 String#replace 方法的匿名回调方法,其中的值可以传递给其他方法。

【讨论】:

  • 感谢@Wiktor 指出正确的方向。我想我终于根据您的回答找到了解决方案。我不确定这是否是正确的方法,但它现在有效。创建了新答案,因为代码太杂乱,无法在此处发表评论。如果有错误请纠正我。再次感谢您。
  • 当然!接受先生!
【解决方案2】:

此答案基于@Wiktor Stribiżew 答案,它使用其他字符串值替换字符串中的所有值并从中计算 lerp 值。

// Basic lerp function
function lerp (min, max, amount) {
    return min + amount * (max - min);
}

function lerpAllNumbers (a, b, amount) {

    a = 'rotate(-35.4deg 45.3deg)';
    b = 'rotate(100deg 200deg)';
    bArr = b.match(/-?\d*[,.]?\d+/g);

    console.log(
        a.replace(/-?\d*[,.]?\d+/g, function(m) {
            return utils.lerp(Number(m), bArr.shift(), amount).toFixed(3)
        })
    ); // rotate(99.946deg 199.938deg)
}

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多