Сумма строк в JavaScript (не в таблице) - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть текстовое поле для ввода значений, которые представляют собой строки и столбцы (но не таблицу), и я хочу иметь возможность добавлять значения строк по отдельности. Моя логика заключается в том, что я заставляю пользователя вводить количество введенных им строк, делю ввод, чтобы создать строку, а затем делю ее на количество вводимых строк. Вот что у меня есть. Рад за лучшие решения. Поочередно я немного почитал и подумал, что могу преобразовать строки в фактические <tr> с и затем просмотреть их (я также хотел бы иметь возможность сделать это для столбцов на более позднем этапе). Заранее спасибо:

<html>
<head>
<script type='text/javascript'>

function sum(){ 
var rows= document.getElementById('rows').value;
    var val = document.getElementById('userInput').value;
    var temp = val.split(" ");
var lines=temp.split(rows);

var total = 0;
var v;

    for(var i = 0; i < temp.length; i++) {
      v = parseFloat(lines[i]);
      //this is what I am missing to get each row's sum separately
    } 




document.write(//each row total); 


  } 

</script>
</head>
<body>
<form id="input">
  <textarea id="userInput"></textarea> 
Number of rows: <textarea id="rows"></textarea>
  <input id="Run" type=Button value="run" onClick="sum()" />
</form>


</body>
</html> 

Итак, теперь у меня есть следующее (мне пришлось добавить v обратно), но оно возвращает NaN (и в любом случае я обращаюсь к последнему предложению):

<script type='text/javascript'>
 function sum() {
var grandTotal = 0,
   rowTotals = [], // array to hold individual row totals
   rowData,
   rows,
   val,
var v;
   rawData = document.getElementById('userInput').value;


 rows = rawData.split("\n");

 for (var i=0; i < rows.length; i++) {
  rowTotals[i] = 0;
  rowData = rows[i].split(" ");

  for (var j=0; j < rowData.length; j++) {
     val = parseFloat(rowData[j]);
    if (!isNaN(v)) rowTotals[i] += v;
  }
  alert("Total for row " + (i + 1) + ": " + rowTotals[i]);
  grandTotal += rowTotals[i];
 }

 alert("Grand total: " + grandTotal);
}


</script>

1 Ответ

1 голос
/ 09 сентября 2011

Предполагая, что пользователь ввел данные в следующем формате:

12.1 4.8 11.2 4.1
1.2 3.4 5.6 99.9
etc

То есть с новой строкой в ​​конце каждой строки и пробелами между числами, вы можете сделать что-то вроде этого:

function sum() {
   var grandTotal = 0,
       rowTotals = [], // array to hold individual row totals
       rowData,
       rows,
       val,
       rawData = document.getElementById('userInput').value;

   // if desired replace this comment with regex validation of rawData

   rows = rawData.split("\n");

   for (var i=0; i < rows.length; i++) {
      rowTotals[i] = 0;
      rowData = rows[i].split(" ");
      // if you need to test that each row has the same number
      // of values in it do that here

      for (var j=0; j < rowData.length; j++) {
         val = parseFloat(rowData[j]);
         // add validation of val here
         rowTotals[i] += val;
      }
      alert("Total for row " + (i + 1) + ": " + rowTotals[i]);
      grandTotal += rowTotals[i];
   }

   // at this point rowTotals is an array containing
   // the individual row totals, so do what you like with that

   alert("Grand total: " + grandTotal);
}

В функции есть две точки, в которых вам нужно будет проделать дополнительную работу:

  1. Вы должны проверить, что результат из parseFloat() на самом деле является числом -пользователь мог ввести буквенные символы или знаки препинания, в этом случае он вернет NaN.В качестве альтернативы используйте регулярное выражение для проверки всей строки для форматирования и недопустимых символов, прежде чем делать что-либо еще.
  2. Разделение строки на новую строку "\ n" может быть проблемой в том, что разные платформы используют разные символы для разрывов строк,Я считаю, что некоторые используют просто новую строку "\ n", некоторые используют просто возврат каретки "\ r", а некоторые используют оба.Вероятно, вы могли бы нормализовать это до разделения, используя поиск и замену.

Я оставляю обе точки в качестве упражнения для читателя ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...