我正在尝试构建一个函数来将字母(“ 293”)转换为数字(2093)。 到目前为止,它仍然有效,但仅适用于特定数量。它可以正常工作,直到达到1000以上的数字为止。从那里所有错误:
parseInt("eight thousand two hundred thirty-three") // returns 8135
parseInt("seven thousand nine hundred ninety eight") // returns 7207
parseInt("three thousand eight hundred ninety nine") // returns 3207
function parseInt(string) {
var numberContainer = []
const leyend = [
["one",1],["two",2],["three",3],["four",4],["five",5],["six",6],["seven",7],["eight",8],["nine",9],["ten",10],["twenty",20],["thirty",30],["forty",40],["fifty",50],["sixty",60],
["seventy",70],["eighty",80],["ninety",90],
["eleven",11],["twelve",12],["thirteen",13],["fourteen",14],["fifteen",15],["sixteen",16],["seventeen",17],["eighteen",18],["nineteen",19],["hundred",100],
["thousand",1000],["-",false],["and",false]
]
var stringContainer = string.split(" ");
console.log(stringContainer)
for (let i=0;i<stringContainer.length;i++){
for (let j=0;j<leyend.length;j++){
if (stringContainer[i] === leyend[j][0]){
numberContainer.push(leyend[j][1])
}
else if (stringContainer[i].includes("-")){
var res = stringContainer[i].split("-");
stringContainer[i] = res[0];
stringContainer.push(res[1]);
}
else if (stringContainer[i].includes(" and ")){
var res = stringContainer[i].split("and");
stringContainer[i] = res[0];
stringContainer.push(res[1]);
}
}
}
const definitiveNumber = numberContainer.reduce((a, b) => a < b ? a*b : a+b);
return definitiveNumber
}
console.log(parseInt("one")) // allgood: returns 1
console.log(parseInt("twenty")) // allgood: returns 20
console.log(parseInt("two thousand forty-six")) // allgood: returns 2046
console.log(parseInt("ninety seven")) // allgood: 97
console.log(parseInt("eight thousand five hundred fifty-seven")) // BAD: returns 8162
答案 0 :(得分:3)
您可以使用Array.prototype.reduce
缩短一行代码:
array.reduce((a, b) => a < b ? a*b : a+b);
示例:
const array = [2, 1000, 40, 6]
const result = array.reduce((a, b) => a < b ? a*b : a+b);
console.log(result);
答案 1 :(得分:0)
如果要计算位数并比较长度,可以将数字转换为字符串
赞:
(""+numberContainer[i+1]).length > (""+numberContainer[i]).length
但这仅适用于整数
答案 2 :(得分:0)
您的算法工作超出了您的想象:
获取第一个数字,将其与第二个数字进行比较,确定要做什么(2,1000 => 2000)-确定, definitiveNumber = 2000 < / p>
从数组中获取第二个数字,将其与第三个数字进行比较,确定要做什么(1000、40 => 1040)-不考虑在内, definitiveNumber = 3040
从数组中获取第三个数字,将其与第四个数字进行比较,确定要执行的操作(40,6 => 46)-确定, definitiveNumber = 3086 >
算法停止,因为第四个之后没有项目
您的结果是:3086
您要比较数字,然后越过它们吗?
const numberContainer = [2, 1000, 40, 6]
let definitiveNumber = 0;
for (let i = 0; i < numberContainer.length; i++) {
if (numberContainer[i] < numberContainer[i + 1]) {
definitiveNumber += numberContainer[i] * numberContainer[i + 1]
}
if (numberContainer[i] > numberContainer[i + 1]) {
definitiveNumber += numberContainer[i] + numberContainer[i + 1]
}
// this is the solution
i++
}
console.log(definitiveNumber) // expected output: 2046