如何解决Node-fetch JSON 问题
我目前正在为我的不和谐机器人开发计算器功能。我做了一个获取steam市场物品价格的命令,然后根据公式计算:([price] - [price * 0.15]) * amount of cases
,其中0.15是市场费用。这就是问题出现的地方。
程序将 json.lowest_price
视为一个词,而不是一个数字(我认为)。结果,bot 发送带有 NaN
的消息。我不知道如何让我的代码正确地将 JSON 视为数字。
这是我的代码:
const Discord = require('discord.js');
const fetch = require('node-fetch');
const client = new Discord.Client();
client.login('[TOKEN]');
client.on('ready',() => {
console.log(`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¤cy=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.log(error);
message.channel.send('tracking breakout price failed');
});
}
}
});
解决方法
响应包括 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.log({ 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¤cy=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.log(error);
message.channel.send('tracking breakout price failed');
});
}
}
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。