关于如何解决使用JavaScript仅从字符串中提取数字的问题的建议



我是stackoverflow的新手,希望能给我一些建议来帮助我解决这个问题。我有两个字符串,我想从中提取数字

String 1 = "12.3,Name1,3,4,Name2,35,Name3"返回[12.3,3,4,35]

这是必需的结果。

String 2 = "12.3,22,Q"返回[12.322]这是错误的结果,应该是[12.3,22]

我已经用完成任务所采取的步骤对我的代码进行了评论。再次感谢您提前提供的建议和帮助。

这是我的代码副本:

function extractNumbers(str) {
//Use replace() to replace all instances of letters/alpha*
let onlyNumbersString = str.replace(/[a-z]/ig, '');
//remove "," using replace()*
onlyNumbersString = onlyNumbersString.replace(",", "");
//Create an array of numbers* 
let arrayOfNumbers = onlyNumbersString.split(',');

let result = arrayOfNumbers.map((x) => parseFloat(x))
console.log(arrayOfNumbers)
console.log(result);
const filtered = result.filter(function(e) {
return e
})
console.log(filtered)
}

let numbers = "12.3,Name1,3,4,Name2,35,Name3" //returns [12.3,3,4,35]
//"12.3,22,Q" returns [12.322]*
extractNumbers(numbers)

您可以简单地在,上进行拆分,并检查它是否是非的有效数字

function extractNumbers(str) {
let onlyNumbersString = str.split(',').filter(v => /^d+(.d+)?$/.test(v))
console.log(onlyNumbersString)
}

let numbers = "12.3,Name1,3,4,Name2,35,Name3" //returns [12.3,3,4,35]
//"12.3,22,Q" returns [12.322]*
extractNumbers(numbers)
extractNumbers('12.3,22,Q')

如果您不想使用regex,可以使用isNaN

let onlyNumbersString = str.split(',').filter(v => v.trim() && !isNaN(v))

错误的结果是因为这一行:

onlyNumbersString = onlyNumbersString.replace(",", "");

一旦这样做,"12.3,22,"(以前是"12.3,22,Q",但之前去掉了Q(就变成了"12.322",所以看起来像是一个单独的数字。

我会先拆分,然后删除其中包含非数字文本的段,然后转换为数字:

function extractNumbers(str) {
// Split on commas, since that seems to be the delimiter you want
const parts = str.split(",");
// Remove any strings that aren't all number chars (including `.`)
const filtered = parts.filter((s) => !/[^.d]/.test(s));
// Convert to number
const numbers = filtered.map((s) => parseFloat(s));
return numbers;
}
console.log(extractNumbers("12.3,Name1,3,4,Name2,35,Name3"));

或无评论:

function extractNumbers(str) {
const parts = str.split(",");
const filtered = parts.filter((s) => !/[^.d]/.test(s));
const numbers = filtered.map((s) => parseFloat(s));
return numbers;
}

你可以把它做成一个单独的语句,但调试起来会变得更困难:

function extractNumbers(str) {
return str
.split(",")
.filter((s) => !/[^.d]/.test(s))
.map((s) => parseFloat(s));
}

我应该注意的是,检查一个段是否有效的唯一原因是parseFloat会很高兴地接受"123abc",返回123并忽略其余部分。您可以使用一元+运算符或Number函数来检查""的情况(如果您不剔除它,就会得到0(:

function extractNumbers(str) {
const parts = str.split(",");
const numbers = parts.map((s) => s.trim() ? +s : NaN);
const validNumbers = numbers.filter((num) => !isNaN(num));
return validNumbers;
}
console.log(extractNumbers("12.3,Name1,3,4,Name2,35,Name3"));

我在这里的答案介绍了将字符串转换为数字的各种选项,以及每种选项的陷阱。

我认为您可以使用以下regex 构建所需的输出

/bd+.?d*b/g

这是假设没有像Name2 45这样的字符串

const str = "12.3,Name1,3,4,Name2,35,Name3";
console.log(str.match(/bd+.?d*b/g))

最新更新