Форматирование числа десятичным - PullRequest
0 голосов
/ 05 декабря 2018

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

"7970521.5544"

даст мне

 ["7000000", "900000", "70000", "500", "20", "1", ".5", ".05", ".004", ".0004"]

Я пытался:

  var j = "7970521.5544"

  var k =j.replace('.','')

  var result = k.split('')

  for (var i = 0; i < result.length; i++) {
  console.log(parseFloat(Math.round(result[i] * 10000) /10).toFixed(10))
}

Есть идеи, я не уверен, куда идти дальше?

Ответы [ 5 ]

0 голосов
/ 26 апреля 2019
function standardToExpanded(n) {
    return String(String(Number(n))
        .split(".")
        .map(function(n, i) {
            // digits, decimals..
            var v = n.split("");
            // reverse decimals..
            v = i ? v.reverse() : v;
            v = v
                .map(function(x, j) {
                    // expanded term..
                    return Number([x, n.slice(j + 1).replace(/\d/g, 0)].join(""));
                })
                .filter(Boolean); // omit zero terms
            // unreverse decimals..
            v = i ? v.map(function(x) { 
                return '.' + String(x).split('').reverse().join('') 
            }).reverse() : v;
            return v;
        })).split(',');
}
console.log(standardToExpanded("7970521.5544"));
// -> ["7000000", "900000", "70000", "500", "20", "1", ".5", ".05", ".004", ".0004"]

Это похоже на что-то из старой математической книги моего сына 3-го класса (основной учебный план)!

0 голосов
/ 06 декабря 2018

Короткая альтернатива (не работает в IE):

var s = "7970521.5544"
var i = s.split('.')[0].length

var a = [...s].reduce((a, c) => (i && +c && a.push(i > 0 ?
     c.padEnd(i, 0) : '.'.padEnd(-i, 0) + c), --i, a), [])

console.log( a )

IE версия:

var s = "7970521.5544"
var i = s.split('.')[0].length

var a = [].reduce.call(s, function(a, c) { return (i && +c && a.push(i > 0 ?
        c + Array(i).join(0) : '.' + Array(-i).join(0) + c), --i, a); }, [])

console.log( a )
0 голосов
/ 05 декабря 2018

Вы можете использовать padStart и padEnd в сочетании с reduce() для построения массива.Сумма, которую вы хотите заполнить, будет индексом десятичной дроби минус индекс в цикле для элементов слева от десятичной дроби и противоположных справа.

Используя reduce(), вы можете создать новый массив с помощьюмягкие строки, старающиеся избегать нулей и самого десятичного числа.

let s = "7970521.5544"
let arr = s.split('')
let d_index = s.indexOf('.')
if (d_index == -1) d_index = s.length  // edge case for nums with no decimal

let nums = arr.reduce((arr, n, i) => {
  if (n == 0 || i == d_index) return arr
  arr.push((i < d_index) 
      ? n.padEnd(d_index - i, '0')
      : '.' + n.padStart(i - d_index, '0'))
  return arr
}, [])

console.log(nums)
0 голосов
/ 05 декабря 2018

Вы можете split свою строку и затем использовать метод Array.prototype.reduce.Обратите внимание на десятичную позицию, а затем просто добавьте значение "0" соответственно.Примерно так:

var s = "7970521.5544";
var original = s.split('');
var decimalPosition = original.indexOf('.');
var placeValues = original.reduce((accum, el, idx) => {
  var f = el;
  if (idx < decimalPosition) {
    for (let i = idx; i < (decimalPosition - 1); i++) {
      f += "0";
    }
    accum.push(f);
  } else if (idx > decimalPosition) {
    let offset = Math.abs(decimalPosition - idx) - 2;
    for (let i = 0; i <= offset; i++) {
      f = "0" + f;
    }
    f = "." + f;
    accum.push(f);
  }
  return accum;
}, []);

console.log(placeValues);
0 голосов
/ 05 декабря 2018

Алгоритм:

Разделить число на две части с использованием десятичной записи.

Запустить цикл for для умножения каждой цифры насоответствующая степень 10, например:
value = value * Math.pow(10, index); // for digits before decimal
value = value * Math.pow(10, -1 * index); // for digits after decimal

Затем фильтр ненулевые элементы и concat объединяют оба массива.(не забудьте повторно перевернуть массив левой стороны)

var n = "7970521.5544"

var arr = n.split('.'); // '7970521' and '5544'
var left = arr[0].split('').reverse(); // '1250797'
var right = arr[1].split(''); // '5544'

for(let i = 0; i < left.length; i++)
  left[i] = (+left[i] * Math.pow(10, i) || '').toString();

for(let i = 0; i < right.length; i++) 
  right[i] = '.' + +right[i] * Math.pow(10, -i);

let res = left.reverse() // reverses the array
  .filter(n => !!n) 
// ^^^^^^ filters those value which are non zero
  .concat(right.filter(n => n !== '.0'));
// ^^^^^^ concatenation
  
console.log(res);
...