我是javascript的新手,如果我错过了一些简单的事情,那么道歉。我正在编写一个脚本,从Sheets中的一个单元格中取一个字符串,将5%的增值税添加到任何适用的数字,并在新单元格中输出修改后的字符串。我很高兴正则表达式捕获我需要的数字,但修改后的字符串是正确的证明是非常棘手的。
到目前为止,脚本看起来像这样:
function strReplace() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var str = sheet.getRange(4,2).getValue(); // A cell with a string like this: "ID: 10101010101010 | Price 1: £4.54 | Price 2: £2.87"
var regex = /\d{1,8}(?:\.\d{1,8})/g // Regex to ignore numbers greater than 8 digits, including decimals
var newStr = str.match(regex);
for (var x = 0; x < newStr.length; x++) {
var newRates = newStr[x]*1.05;
var output = str.replace(newStr, newRates)
sheet.getRange(4,3).setValue(output);
}
}
我尝试了很多变化但没有成功。我觉得有一种更简单的方法来实现我所拥有的东西。任何建议都将不胜感激。
谢谢!
答案 0 :(得分:1)
要执行此类操作,请使用replace
的函数回调版本:
var str = "ID: 10101010101010 | Price 1: £4.54 | Price 2: £2.87";
var regex = /\d{1,8}(?:\.\d{1,8})/g; // Regex to ignore numbers greater than 8 digits, including decimals
var output = str.replace(regex, function(match) {
return 1.05 * match;
});
console.log(output);
您可以选择使用parseFloat(match)
而不是仅使用match
,*
依赖.toFixed(2)
强制字符串编号。
你可能会考虑var str = "ID: 10101010101010 | Price 1: £4.54 | Price 2: £2.87";
var regex = /\d{1,8}(?:\.\d{1,8})/g; // Regex to ignore numbers greater than 8 digits, including decimals
var output = str.replace(regex, function(match) {
return (1.05 * match).toFixed(2);
});
console.log(output);
对结果进行舍入并格式化为两个位置(取决于你是否想要绕过它的方式)。例如:
{{1}}
答案 1 :(得分:1)
基本上你的解决方案非常接近,你只需要分配str.replace
,使用newStr[x]
并等待结束for
将其分配到单元格中。
检查下面的示例。
function strReplace() {
let str = "ID: 10101010101010 | Price 1: £4.54 | Price 2: £2.87";
var regex = /\d{1,8}(?:\.\d{1,8})/g
var newStr = str.match(regex);
for (var x = 0; x < newStr.length; x++) {
var newRates = parseFloat(newStr[x]) * 1.05;
str = str.replace(newStr[x], newRates)
}
return str;
}
var replaced = strReplace();
console.log(replaced)
&#13;