正则表达式检测数字但不检测小数

Regex to detect numbers but not decimal

我正在创建格式化定价的格式化程序。这个想法是,如果用户键入“between 45 and 50”,它应该 return“between .00 and .00”。或者,如果用户键入“between 45.58 to 38.91”,它应该 return“between .58 to .91

这是我目前所拥有的 -

function formatPricesInString($str){
    var x = $str.match(/\d+/g);
    if(x != null){
        $.each(x, function(i, v){
            $str = $str.replace(v, formatPrice(v));
        });
    }
    return $str;
}

这里的 formatPrice(v) 是另一个函数,如果您传递 45,它将 return 45.00 美元。

现在,我的函数 - formatPricesInString($str), if I pass 45 - 50, it returns .00 - .00,很好, 但如果我通过 45.00 - 50.00 it is returning .00.[=18=].00 - .00.[=18=].00.

基本上,它会获取所有数字 - 45、00、50、00 并对其进行格式化。

如果传递 45.00 或 45.56,我该如何处理这种情况,它不应该做任何事情,但如果我只是在字符串中传递普通整数,它应该 return 格式化价格。

也欢迎任何其他优化方式。

formatPrice(...) 方法 -

function formatPrice(price) {
    var symbol = $("#currencySymbolData").attr('data-symbol');
    if (typeof symbol === "undefined" || symbol == '') {
        symbol = '$';
    }
    var symbol_loc = $("#currencySymbolData").attr('data-symbol-loc');
    if (typeof symbol_loc === "undefined" || symbol_loc == '') {
        symbol_loc = 'before';
    }
    price = precise_round(price, 2).toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, ",");
    if (symbol_loc == 'after') {
        return price + symbol;
    } else {
        return symbol + price;
    }
}

编辑 - 答案

在@RomanPerekhrest 提供的代码的帮助下,这成功了 -

function formatPricesInString($str){
    return $str.replace(/($?\d+(\.\d+)?)\b/g, function(m){
        m = (m[0] === '$')? m.slice(1) : m;
        return formatPrice(m);
    });
}

考虑以下使用 String.prototype.replace() 函数和 替换回调 的解决方案:

var str = 'between 45 and 50 and between 45.58 to .91',
    formatted = str.replace(/($?\d+(\.\d+)?)\b/g, function (m) {
        var prefix = (m[0] === '$')? '' : '$';
        return prefix + ((m.indexOf('.') === -1)? Number(m).toFixed(2) : m);
    });

console.log(formatted);