如何解决此for循环以翻译数字

时间:2019-06-17 10:22:20

标签: javascript

我正在尝试构建一个函数来将字母(“ 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

3 个答案:

答案 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)

您的算法工作超出了您的想象:

  1. 获取第一个数字,将其与第二个数字进行比较,确定要做什么(2,1000 => 2000)-确定, definitiveNumber = 2000 < / p>

  2. 从数组中获取第二个数字,将其与第三个数字进行比较,确定要做什么(1000、40 => 1040)-不考虑在内, definitiveNumber = 3040

  3. 从数组中获取第三个数字,将其与第四个数字进行比较,确定要执行的操作(40,6 => 46)-确定, definitiveNumber = 3086 >

  4. 算法停止,因为第四个之后没有项目

您的结果是: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