正则表达式检测数字但不检测小数
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);
我正在创建格式化定价的格式化程序。这个想法是,如果用户键入“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);