FunctionProject/api/assets/functions/main/armstrongNumber.js
2020-08-03 14:14:45 +02:00

60 lines
1.8 KiB
JavaScript

const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
/**
* @description Vérifie si un nombre fait partie des nombres d'Armstrong.
* @param {Number} number - Le nombre à tester
* @returns {Object} Un objet contenant l'explication en html et le booléen si oui ou non c'est un nombre d'armstrong
* @examples armstrongNumber(153) → 153 est un nombre d'Armstrong, car 1<sup>3</sup> + 5<sup>3</sup> + 3<sup>3</sup> = 153.
*/
function armstrongNumber (number) {
const numberString = number.toString()
const numberStringLength = numberString.length
let result = 0
let resultString = ''
for (let index = 0; index < numberStringLength; index++) {
result = result + parseInt(numberString[index]) ** numberStringLength
resultString =
resultString +
' + ' +
numberString[index] +
'<sup>' +
numberStringLength +
'</sup>'
}
const formattedNumber = formatNumberResult(number)
const isArmstrongNumber = result === number
return {
isArmstrongNumber,
resultHTML: `<p>${formattedNumber} ${
isArmstrongNumber ? 'est' : "n'est pas"
} un nombre d'Armstrong, car ${resultString.slice(
2
)} = ${formatNumberResult(result)}.</p>`
}
}
/* OUTPUTS */
module.exports = ({ res, next }, argsObject) => {
let { number } = argsObject
// S'il n'y a pas les champs obligatoire
if (!number) {
return errorHandling(next, requiredFields)
}
// Si ce n'est pas un nombre
number = parseInt(number)
if (isNaN(number) || number <= 0) {
return errorHandling(next, {
message: 'Veuillez rentré un nombre valide.',
statusCode: 400
})
}
return res.status(200).json(armstrongNumber(number))
}