Вот пример того, что я пытаюсь сделать...
Допустим, у меня есть номер 73 284.
Число тысяч равно 73 (73 284 разделить на 1000).
Количество сотен равно 2 (284 разделить на 100).
Количество десятков равно 8 (84 разделить на 10).
Количество одиночек – 4 (осталось 4).
Мне нужна функция Javascript, которая возьмет число 73 284 и создаст из него 4 числа, используя указанные выше критерии.
Итак, если бы число было 73 284, я бы передал это число в функцию в качестве параметра, и функция вернула бы массив, который выглядит следующим образом: [73,2,8,4].
Я попытался использовать функцию Math.round(). Казалось, что это работает для тысяч, но не обязательно для сотен, десятков и одиночных.
Вы, наверное, хотите пол, а не круглый
Привет, добро пожаловать в stackoverflow. Укажите любую попытку, которую вы уже предприняли. В случае сомнений обратитесь к разделу Как спросить.
Я изменил свое решение, включив в него арифметику, предоставленную Jamiec. Спасибо!
Вы можете сделать это, отслеживая, сколько тысяч, сотен и десятков у вас есть, и удаляя их по ходу дела. Немного простой арифметики.
function get(num){
const thousands = Math.floor(num/1000)
const hundreds = Math.floor((num-thousands*1000)/100);
const tens = Math.floor((num-thousands*1000-hundreds*100)/10);
const units = Math.floor(num-thousands*1000-hundreds*100-tens*10)
return [
thousands,
hundreds,
tens,
units
]
}
const [th,hu,te,un] = get(73284)
console.log("Thousands=",th);
console.log("Hundreds=",hu);
console.log("Tens=",te);
console.log("Units=",un);
Ямик, спасибо большое! Это работает. Мне не хватало части «удалить их по ходу» в моем попытке решения. Еще раз спасибо!
Вот простой пример:
function test(num) {
const arr = num.toLocaleString().split(',');
arr[arr.length-1].toString().split('').map(x=>arr.push(x));
arr[arr.length-4]=0;
return arr.map(x=>+x).filter(x=>x);
}
test(1234); // [1,2,3,4]
test(73284); // [73,2,8,4]
Это также работает для миллионов и так далее. Здесь мы определили функцию, которая преобразует число в localeString и разделяет число. Затем мы перебираем массив и преобразуем каждый элемент в числа.
Простой цикл.
const f = (n) => {
let div = 1000;
const result = [];
for (let i = 0; i < 4 && n; i++, n %= div, div /= 10) {
result.push(Math.floor(n / div));
}
return result;
}
console.log(f(73284));
Вам понадобится комбинация деления с Math.floor и оператором по модулю (%
). Оператор Modulo возвращает напоминание о делении.
Поскольку вы будете выполнять эту операцию несколько раз, это отличная возможность использовать рекурсию. Вот что я придумал.
Во-первых, нам нужно получить, сколько заданных делителей у нас есть на входе. Для этого вы можете разделить его и игнорировать десятичную дробь, используя Math.floor
.
const input = 73284
const divider = 1000
const amoutOfDividerInInput = input / divider .
// this returns 73.284, we don't want the .284 so we can use Math.floor.
const amountOfDividerInInputWithoutDecimal = Math.floor(amoutOfDividerInInput)
// we print the value
console.log("there are " + amountOfDividerInInputWithoutDecimal + " 1000s in " + input).
Затем нам нужно проверить, что является напоминанием об этой операции, и здесь появляется оператор по модулю.
const input = 73284
const divider = 1000
const reminderOfTheDivision = input % divider;
// this gives us 284.
Затем мы можем использовать это напоминание в качестве нового ввода и разделить делитель на 10, чтобы узнать, сколько сотен содержится в нем.
// we devide the divider by 10,
const newDevider = divider / 10;
// we calculate the new amount and reminder
const amoutOfNewDividerInInput = Math.floor(reminderOfTheDivision / newDivider );
const reminderOfTheNewDivision = reminderOfTheDivision % newDivider
// we print the new values
console.log("There are " + amoutOfNewDividerInInput + " 100s in" + input)
И так продолжается до тех пор, пока мы не опустимся до одной цифры.
Как видите, в этом коде много повторений. Хороший разработчик старается избежать повторения любой ценой. Чтобы предотвратить это, мы могли бы использовать цикл или рекурсивную функцию. Рекурсивная функция — это, по сути, функция, которая вызывает сама себя. Я решил использовать функцию, так как она чище.
Вот что я придумал.
function findDividingQuantity(reminder, divider) {
// if the devider is less than 10, we simply print the reminder.
if(divider < 10) {
console.log('and ' + reminder + ' remains.');
// and we returns to stop the recursion.
return;
}
// otherwise, we get the current amount of the divider in the reminder.
const amount = Math.floor(reminder / divider);
// we then calculate how much is left after the first division,
// this will become our new reminder.
const newReminder = reminder % divider;
// knowing how many of the divider there is in the input, we can print it.
console.log(amount + " " + divider + "s.");
// we call the function again, but with the new reminder
// and the divider divided by 10
findDividingQuantity(newReminder, divider / 10)
}
const input = 73284
console.log("In " + input + " there is: ");
// we call the function with the initial divider: 1000.
findDividingQuantity(input, 1000)
I tried to use the Math.round() function. It seemed to work for the thousands, but not necessarily for the hundreds, tens, and singles.
: пожалуйста, покажите, что вы пробовали.