我正在创建格式化程序,用于格式化定价。我们的想法是,如果用户输入“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);
});
}
答案 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);