首页 > 解决方案 > 以数字字为参数的 parseInt 函数

问题描述

我需要一些帮助,我的代码适用于三位数字,我需要这个与七位数字一起使用。首先拆分输入,然后迭代并与数据库变量进行比较..我真的停留在这一点上。输入可能包含也可能不包含连字符。提前致谢。

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')); //246
console.log(parseInt("one hundred seventy-one")); //171
console.log(parseInt('one thousand two hundred and thirty')); // not works

标签: javascript

解决方案


在阅读了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>


推荐阅读