Невозможно преобразовать строку в число с плавающей точкой - не число (NaN) - PullRequest
0 голосов
/ 21 мая 2019
I need to convert string to float to summarize all numbers and get the average.

I have tried Number(), parseFloat none of them are giving me the expected output.

Например, вместо возврата 2 возвращается '11'

Я собираю данные из этого API: https://www.hatchways.io/api/assessment/students obs (чтобы получить данные, я создал сервис:экспорт класса StudentsService {

StudentsUrl: string = "https://www.hatchways.io/api/assessment/students";

конструктор (private http: HttpClient) {}

// приведение наблюдаемого в массив Students getAllStudents ():Наблюдаемый <{student: Students []}> {// return this.http.get (this.studentsUrl); return this.http.get <{Students: Students []}> (${this.studentsUrl});}}

getAVG() {
for(let i = 0; i < this.students.length; i++) {
      //console.log('Estudante número: '+ i);
      for(let z = 0; z < 8; z++) {
        //console.log('Notas index: ' + z);
        this.grades[i] += Number(this.students[i].grades[z]);
        console.log('nota: '+ this.students[i].grades[z]);
      }
      var num = parseFloat(this.grades[0]);
      console.log('#######sum das notas######: ' + num);
    }
}

I need to sum all grades in the array to calculate the average and display it

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Вы должны инициализировать this.grades[i]=0;, прежде чем начинать второй цикл (один с 'z).

for(let i = 0; i < this.students.length; i++) {
  //console.log('Estudante número: '+ i);

  this.grades[i]=0;

  for(let z = 0; z < 8; z++) {
    //console.log('Notas index: ' + z);
    this.grades[i] += Number(this.students[i].grades[z]);
    console.log('nota: '+ this.students[i].grades[z]);
  }
  var num = parseFloat(this.grades[0]);
  console.log('#######sum das notas######: ' + num);
}

}

0 голосов
/ 21 мая 2019

Вы на правильном пути с parseFloat() (parseInt() в этом случае также будет работать), это просто вопрос правильного использования.

Вы, по сути, хотите просмотреть каждый grade массива student.grades и добавить его значение к сумме, которую вы позже поделите, но к количеству оценок.

Примерно так

this.students.forEach(student =>
{
    let sum = 0;
    student.grades.forEach(grade=>sum+=parseFloat(grade))  //Goes through each grade, parses it as float and add it's result to sum
    let avg = sum/student.grades.length;
})

Примечание : я использую forEach для итерации массивов, но использование регулярного цикла for также хорошо.Здесь просто вопрос предпочтений

Существуют и другие способы получения суммы / среднего (один из них - array.reduce), но пока вы анализируете свою строку, все в порядке.

Вот рабочий Stackblitz вашего сценария для иллюстрации.

Если у вас есть какие-либо вопросы, дайте мне знать

...