为了账号安全,请及时绑定邮箱和手机立即绑定

以数字字为参数的 parseInt 函数

以数字字为参数的 parseInt 函数

慕后森 2022-10-13 16:16:19
我需要一些帮助,我的代码适用于三位数字,我需要这个与七位数字一起使用。首先拆分输入,然后迭代并与数据库变量进行比较..我真的停留在这一点上。输入可能包含也可能不包含连字符。提前致谢。function parseInt(string) {  var output = [];  var dataBase = {    'zero': 0,    'one': 1,    'two': 2,    'three': 3,    'four': 4,    'five': 5,    'six': 6,    'seven': 7,    'eight': 8,    'nine': 9,    'ten': 10,    'eleven': 11,    'twelve': 12,    'thirteen': 13,    'fourteen': 14,    'fifteen': 15,    'sixteen': 16,    'seventeen': 17,    'eighteen': 18,    'nineteen': 19,    'twenty': 20,    'thirty': 30,    'forty': 40,    'fifty': 50,    'sixty': 60,    'seventy': 70,    'eighty': 80,    'ninety': 90,    'hundred': 100,    'thousand': 1000,    'million': 1000000,    'and': 0  }  var arr = string.split(" ");  console.log(arr);  var length = arr.length;  for (i = 0; i < length; i++) {    if (arr[i].includes("-")) {      var index = arr.indexOf(arr[i]);      var hecta = arr[i].split('-');      arr.splice(index, 1, hecta[0], hecta[1]);    }  }  console.log(arr);  for (i = 0; i < arr.length; i++) {    output.push(dataBase[arr[i]]);  }  console.log(output);  var transform = 0;  transform = output[0] * output[1] + output[2] + output[3];  return transform;}console.log(parseInt('two hundred forty-six')); //246console.log(parseInt("one hundred seventy-one")); //171console.log(parseInt('one thousand two hundred and thirty')); // not works
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

在阅读了mlibby的评论(以百万为单位的值)之后,我决定从头开始。

结果真的很简单!


我还添加了一个界面以更易读的方式显示结果


const dataBase = 

      { zero: 0, one: 1, two: 2, three: 3, four: 4

      , five: 5, six: 6, seven: 7, eight: 8, nine: 9, ten: 10

      , eleven: 11, twelve: 12, thirteen: 13, fourteen: 14

      , fifteen: 15, sixteen: 16, seventeen: 17, eighteen: 18

      , nineteen: 19, twenty: 20, thirty: 30, forty: 40

      , fifty: 50, sixty: 60, seventy: 70, eighty: 80, ninety: 90

      , hundred: 100, thousand: 1000, million: 1000000, and: 0

      } 


const parseVal=s=>

        s.match(/\w+/g)

         .reduce((tots,sVal)=>

          {

          let n = tots.length -1

          switch (sVal) {

            case 'hundred':

                    tots[n] *= 100

                    break

            case 'thousand':

            case 'million':

                    tots[n] *= dataBase[sVal]

                    tots.push(0)

                    break

            default:

                    tots[n] += dataBase[sVal]

                    break;

            }

          return tots

          },[0]).reduce((a,c)=>a+c);



// testing part...


const myTable = document.getElementById('my-table')


for(let r=1;r<myTable.rows.length;++r )

  {

  let rowCell = myTable.rows[r].cells

  rowCell[1].textContent = parseVal(rowCell[0].textContent).toLocaleString('en')

  if (rowCell[1].textContent === rowCell[3].textContent)

    {

    rowCell[2].textContent = 'OK'

    rowCell[2].className = 'isOK'

    }

  else

    {

    rowCell[2].textContent = 'bad'

    rowCell[2].className = 'isBad'

    }

  }

table {

  border-collapse: collapse;

  margin-top: 25px;

  font-family: Arial, Helvetica, sans-serif;

  font-size: 12px;

  }

thead {

  background-color: aquamarine;

  }

tbody {

  background-color: #e1e7ee;

  }

td {

  border: 1px solid grey;

  padding: .3em .7em;

  }

td:nth-child(2),

td:nth-child(4) {

  text-align: right;

  }

td:nth-child(3) { text-align: center; }

td.isOK { color:green }

td.isBad { color:red }

<table id="my-table">

  <thead>

    <tr>

      <td>text value</td> <td>Parsed</td> <td>validation</td><td>expected</td> 

    </tr>

  </thead>

  <tbody>

    <tr>

      <td>two hundred forty-six</td>

      <td>...</td>

      <td>...</td>

      <td>246</td> 

    </tr>

    <tr>

      <td>two hundred thousand</td>

      <td>...</td>

      <td>...</td>

      <td>200,000</td> 

    </tr>

    <tr>

      <td>two hundred thousand and twelve</td>

      <td>...</td>

      <td>...</td>

      <td>200,012</td> 

    </tr>

    <tr>

      <td>one hundred seventy-one</td>

      <td>...</td>

      <td>...</td>

      <td>171</td> 

    </tr>

    <tr>

      <td>one thousand two hundred and thirty</td>

      <td>...</td>

      <td>...</td>

      <td>1,230</td> 

    </tr>

    <tr>

      <td>three hundred and twenty one million four hundred thirty three thousand seven hundred and eight</td>

      <td>...</td>

      <td>...</td>

      <td>321,433,708</td> 

    </tr>

  </tbody>

</table>


查看完整回答
反对 回复 2022-10-13
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

正如我在评论中指出的那样,您的转换没有做您想要的,您需要反向迭代整个数组以使用您当前的技术。所以我重构了你的代码来演示。我改变了什么?


我用我将使用的名称替换了变量名称(命名是主观的,但我更喜欢它们是描述性的)。


下一步: String.split() 可以采用正则表达式,并且能够一次拆分多个不同的字符。正则表达式/[ -]/仅表示在空格或破折号的任何字符上拆分。


然后: Array.map() 允许我们通过使用指定的函数转换每个元素来从现有数组创建一个新数组(在这种情况下,该函数正在从您的单词“数据库”中查找整数)。


最后,我们遍历数字数组,将它们适当地添加到最终总和中。


function parseInt(string) {

    const wordNumbers = {

      'zero': 0,

      'one': 1,

      'two': 2,

      'three': 3,

      'four': 4,

      'five': 5,

      'six': 6,

      'seven': 7,

      'eight': 8,

      'nine': 9,

      'ten': 10,

      'eleven': 11,

      'twelve': 12,

      'thirteen': 13,

      'fourteen': 14,

      'fifteen': 15,

      'sixteen': 16,

      'seventeen': 17,

      'eighteen': 18,

      'nineteen': 19,

      'twenty': 20,

      'thirty': 30,

      'forty': 40,

      'fifty': 50,

      'sixty': 60,

      'seventy': 70,

      'eighty': 80,

      'ninety': 90,

      'hundred': 100,

      'thousand': 1000,

      'million': 1000000,

      'and': 0

    }

  

    let words = string.split(/[ -]/);

    console.log(words);

    

    let numbers = words.map(word => wordNumbers[word]);

    numbers.reverse();

    console.log(numbers);

  

    let result = 0;

    for(let i = 0; i < numbers.length; i++) {

        if(numbers[i] < 100) {

            result += numbers[i];

        }

        else {

            if(i + 2 < numbers.length && numbers[i + 1] < numbers[i] && numbers[i + 2] < numbers [i + 1]) {

                result += numbers[i] * numbers[i + 1] * numbers[i + 2];

                i++; i++;// need to skip the next two elements of ints in the for loop

            }

            else if(i + 1 < numbers.length && numbers[i + 1] < numbers[i]) {

                result += numbers[i] * numbers[i + 1];

                i++; // need to skip the next element of ints in the for loop

            }

            else {

                result += numbers[i];

            }

        }

    }

    return result;

  }

  

  console.log(parseInt('two hundred forty-six')); //246

  console.log(parseInt("one hundred seventy-one")); //171

  console.log(parseInt('one thousand two hundred and thirty')); // 1230

  console.log(parseInt('twenty million')); // 20000000

  console.log(parseInt('two hundred thousand')); // 200000



查看完整回答
反对 回复 2022-10-13
?
九州编程

TA贡献1785条经验 获得超4个赞

这适用于诸如二十万之类的条目...


function parseInt(string) {

  var output = [];

  var dataBase = {

    'zero': 0,

    'one': 1,

    'two': 2,

    'three': 3,

    'four': 4,

    'five': 5,

    'six': 6,

    'seven': 7,

    'eight': 8,

    'nine': 9,

    'ten': 10,

    'eleven': 11,

    'twelve': 12,

    'thirteen': 13,

    'fourteen': 14,

    'fifteen': 15,

    'sixteen': 16,

    'seventeen': 17,

    'eighteen': 18,

    'nineteen': 19,

    'twenty': 20,

    'thirty': 30,

    'forty': 40,

    'fifty': 50,

    'sixty': 60,

    'seventy': 70,

    'eighty': 80,

    'ninety': 90,

    'hundred': 100,

    'thousand': 1000,

    'million': 1000000,

    'and': 0

  }

   let clarray=[]

   filteroutp=[]

   fo=[]

   var f

   var acc=[]

   var res=0

    const strarray= string.split(' ')

    strarray.forEach((n,i)=>{

      if(n.includes('-')) { 

        nm=n.split('-'), clarray.push(...nm)

      }   

      else clarray.push(n)

    })

      Object.entries(dataBase).forEach(o=>{

    clarray.forEach((x,i)=>{if (x==o[0]) output[i]=o[1] })})

     if(output[output.length-1]&&output[output.length-2]<100&&output.length-2!=0){

      n=output.pop() , f=output.pop()+n

     }

     else f=0

         for(let i=0;i<output.length;i++){

          n=output[i]

          m= output[i+1]

          if(m=="undefined") m=1

          if(output.length>1){

            if(n<m ){

          if(acc.length!=0){

           accn= acc.shift()

            accn<n? fo.push(accn*n*m):fo.push(accn+n*m)

            output.splice(i,2)

            i=-2

            }        

          else if(acc.length==0) {

            acc.push(n*m)

              if(output.length>1){

               output.splice(i,2)

               i=-2 

              }

              if(output.length==1){

                fo.push(acc.shift()*output[0])

                output.splice(0,1)

                 i=-1

              }

            }

          }

      }

      if(output.length==0&&acc.length!=0) fo.push(acc.shift())

    } 

      fo.push(f)

      for(let n of fo){

        res+=n

      }

   

  return "output "+`${fo}` + " number "+res


}


console.log(parseInt('two hundred forty-six')); //246

console.log(parseInt("one hundred seventy-one")); //171

console.log(parseInt('one thousand two hundred and thirty')); //1230

console.log(parseInt('one million one thousand two hundred and thirty')); // 1001230

console.log(parseInt('ten million one-thousand two hundred and thirty-two')); // 10001232

console.log(parseInt('one thousand seventeen hundred and thirty')); // 2730

console.log(parseInt('two hundred thousand')) //200000


查看完整回答
反对 回复 2022-10-13
  • 3 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信