Задание: Ты мог заметить, что у нас иногда возникают проблемы с отображением чисел в нашей игре.
Иногда, у чисел появляются длинные хвосты после запятой.
А бывает, что числа становятся настолько большими, что сложно понять, миллионы это или миллиарды.
Давай реализуем функцию formatNumber(n) в functions.js, которая примет число и вернет строку с его улучшенной версией.
Вот как она должна работать:
Если n < 1000, число должно быть округлено до первого знака после запятой
Иначе, чтобы сократить длину строки, мы используем буквы 'K', 'M', 'B', 'T' чтобы описать
тысячи, миллионы, миллиарды или триллионы. Точность нам не слишком важна, поэтому мы также используем округление.
В этот раз, до двух знаков после запятой.
Примеры: 12352.1 => 12.35K, 1234321 => 1.23M, 12343210000000 => 12.34T
Обязательно измени с помощью formatNumber значения GOLD и PRODUCTION RATE, которые мы выводим на экран.
По желанию, ты можешь применить этот подход и к числам в списке производителей.
Детали:
- formatNumber нужно экспортировать из 'functions.js'
- formatNumber должна преобразовывать число в строку
- formatNumber должна быть реализована согласно описанию задачи
Мой код не проходит по 3-му пункту, вот только не пойму в чем проблема, числа переводит в 1 строку, сокращая их до 1-2 запятых, добавляет букву в зависимости от числа.
export const formatNumber = (n) => {
let i = n.toString();
if (parseInt(i) < 1000) {
return parseFloat(n.toFixed(1)).toString();
} else if (parseInt(i) < 1000000) {
return `${(parseInt(i) / 1000).toFixed(2)}K`;
} else if (parseInt(i) < 1000000000) {
return `${(parseInt(i) / 1000000).toFixed(2)}M`;
} else if (parseInt(i) < 1000000000000) {
return `${(parseInt(i) / 1000000000).toFixed(2)}B`;
} else if (parseInt(i) < 1000000000000000) {
return `${(parseInt(i) / 1000000000000).toFixed(2)}T`;
}
};
functions.js
export const updateGold = (term, state) => {
term.moveTo(25, 2);
term.eraseLineAfter('');
term.bold.yellow(`${formatNumber(state.gold)} `);
if (state.productionRate > 0) {
state.gold += state.productionRate;
};
export const checkInitCompleted = (term, state) => {
term.moveTo(0, 1);
term.eraseLineAfter('');
term(`You can purchase producers by clicking the number button (1, 2, 3, ...)`);
term.moveTo(0, 2);
term.eraseLineAfter('');
term(`GOLD: ${formatNumber(state.gold)}`);
term.moveTo(0, 3);
term.eraseLineAfter('');
term(`PRODUCTION RATE: ${formatNumber(state.productionRate)}`);
state.isInitCompleted = true;
state.isProducerListUpdated = false;
handlers.js
for (let i = 0; i < state.producers.length; i++) {
if (key === `${state.producers[i].id}`) {
state.gold -= state.producers[i].cost;
state.producers[i].cost *= state.producers[i].growthRate;
state.producers[i].count++;
state.productionRate += state.producers[i].baseProduction;
state.isProducerListUpdated = false;
term.moveTo(25, 3);
term.eraseLineAfter('');
term.green(formatNumber(state.productionRate));
};
};