Проблемы с извлечением узлов JSON

В настоящее время я работаю над функцией калькулятора для моего бота Discord. Я сделал команду, которая получает рыночную цену товара Steam, а затем вычисляет ее по формуле: ([price] - [price * 0.15]) * amount of cases, где 0,15 - рыночная комиссия. Вот тут и проявляется проблема.

Программа видит json.lowest_price как слово, а не как число (я думаю). В результате бот отправляет сообщение с NaN. Я понятия не имею, как заставить мой код правильно отображать JSON как число.

Вот мой код:

const Discord = require('discord.js');
const fetch = require('node-fetch');
const client = new Discord.Client();

client.login('[TOKEN]');

client.on('ready', () => {
  console.info(`Logged in as TEST`);
});

//////////////////////////////////

const prefix = "!";
client.on('message', message =>{
  if (!message.content.startsWith(prefix) || message.author.bot) return;
  const args = message.content.slice(prefix.length).trim().split(/ +/);
  const command = args.shift().toLowerCase();

if (command === 'calculate') {
  if (!args.length){
    return message.channel.send(`Invalid argument`);
  } else if (args[0] === 'breakout'){
    fetch(
    'https://steamcommunity.com/market/priceoverview/?appid=730&market_hash_name=Operation%20Breakout%20Weapon%20Case&currency=6',
  )
    .then((res) => res.json())
    .then((json) =>
      message.channel.send(
        `From ${args[1]] breakout cases you will get ${((json.lowest_price)-((json.lowest_price)*0.15))*(args[1])}`,
      ),
    )
    .catch((error) => {
      console.info(error);
      message.channel.send('tracking breakout price failed');
    });
  }
}
});

Проблемы с извлечением узлов JSON

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
40
1

Ответы 1

Ответ включает lowest_price в виде строки (например, "7,89zł"). Кажется, что API включает форматированную валюту в поле lowest_price, поэтому вы получаете NaN, когда работаете с ним.

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

function getNumberFromCurrency(currency) {
  return Number(
    currency
    .replace(/[zł.]/g, '')
    .replace(',', '.')
  )
}

const amount = '10';
const lowestPrice = "7,89zł";
const lowestPriceValue = getNumberFromCurrency(lowestPrice);
const finalPrice = (lowestPriceValue - lowestPriceValue * 0.15) * amount;

console.info({ lowestPriceValue, finalPrice });
// => 7.89, 67.065

Но я бы посоветовал вам установить пакет currency.js, так как с ним действительно легко работать. Он может получить значение из любой валюты и имеет встроенное умножение, вычитание и т. д. Все, что вам нужно, чтобы использовать формулу, которую вы упомянули выше. Посмотрите рабочий код ниже:

const currency = require('currency.js');

// ... 
// ...


client.on('message', (message) => {
  if (!message.content.startsWith(prefix) || message.author.bot) return;
  const args = message.content.slice(prefix.length).trim().split(/ +/);
  const command = args.shift().toLowerCase();

  // you can change the format, localising the decimal and/or delimiter
  const zloty = (value) =>
    currency(value, { symbol: 'zł', separator: '.', decimal: ',' });

  if (command === 'calculate') {
    if (!args.length) {
      return message.channel.send(`Invalid argument`);
    } else if (args[0] === 'breakout') {
      fetch(
        'https://steamcommunity.com/market/priceoverview/?appid=730&market_hash_name=Operation%20Breakout%20Weapon%20Case&currency=6'
      )
        .then((res) => res.json())
        .then((json) => {
          // calculate the final price using currency.js only
          const finalPrice = zloty(
            zloty(json.lowest_price)
             .subtract(
               zloty(json.lowest_price)
                 .multiply(0.15)
               )
            )
            .multiply(args[1])
            .format();

          message.channel.send(`From ${args[1]} breakout cases you will get ${finalPrice}`);
        })
        .catch((error) => {
          console.info(error);
          message.channel.send('tracking breakout price failed');
        });
    }
  }
});

Другие вопросы по теме