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

时间:2017-01-25 21:06:48

标签: javascript php jquery regex regex-lookarounds

我正在创建格式化程序,用于格式化定价。我们的想法是,如果用户输入“between 45 and 50”,则应返回“between $45.00 and $50.00”。或者,如果用户输入“between 45.58 to 38.91”,则应返回“between $45.58 to $38.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,它将返回$ 45.00。

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

基本上,它取所有数字--45,00,50,50并格式化它们。

如何处理这样的情况:如果传递45.00或45.56,它不应该做任何事情,但如果我只是在字符串中传递正常整数,它应该返回格式化价格。

欢迎任何其他优化方式。

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, "$1,");
    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);
    });
}

1 个答案:

答案 0 :(得分:1)

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



var str = 'between 45 and 50 and between 45.58 to $38.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);