Javascript: Как я могу добавить две строки без преобразования в числа? - PullRequest
0 голосов
/ 25 сентября 2019

Учитывая два числа в строковом формате (например, «10 .23» и «25 .69»), как я могу получить их сумму без преобразования строки в числа?(например, '35 .92'). Я не хочу преобразовать строки в числа, используя такие вещи, как parseInt, Number, parseFloat и т. д. *

Ответы [ 3 ]

0 голосов
/ 26 сентября 2019

Старый трюк - умножить на 1, так как это вызывает числовое преобразование.Оператор * не работает со строками, поэтому он вызывает переключение на числа.Хотя, как я уже сказал, это старый трюк.

Унарный оператор плюс является более современным.

var num1 = '20',
    num2 = '30.5';

console.log(num1 * 1 + num2 * 1); // = '50.5'

Если вы хотите, чтобы вывод определенно был строкой, вы также можете:

console.log((num1 * 1 + num2 * 1)+"");
0 голосов
/ 26 сентября 2019

Отказ от ответственности: Я не рекомендую вам делать это на самом деле.Однако вы можете реализовать свой собственный метод добавления, используя предварительно рассчитанную таблицу поиска и грубую реализацию «двоичного» сумматора (преобразованного в десятичную форму).Код ниже работает для вашего примера, но я не даю никаких гарантий, что он будет работать для любых общих случаев.

const lookupTable = Array(10).fill(0)
  .map((_, i) => Array(10).fill(0)
    .map((_, j) => [`${i},${j}`, i+j+'']))
  .reduce((flatArr, innerArr) => [...flatArr, ...innerArr], [])
  .reduce((lookupTable, [k, v]) => ({...lookupTable, [k]: v}), {})

const addDigits = (a, b) => {
  const sum = lookupTable[`${a},${b}`];
  if (sum.length === 2) return [sum[1], '1'];
  else return [sum, '0'];
}

const strAdd = (a, b) => {
  const add = ([aH, ...aT], [bH, ...bT], carryBit='0') => {
    if (aH === undefined && aH === undefined) return '';
    if (aH === undefined) return add([], bT, carryBit) + bH;
    if (bH === undefined) return add(aT, [], carryBit) + aH;
    if (aH === '.' || bH === '.') return add(aT, bT, carryBit) + '.';
    const [partial_sum, partial_carryBit1] = addDigits(aH, bH);
    const [sum, partial_carryBit2] = addDigits(partial_sum, carryBit);
    const [newCarryBit] = addDigits(partial_carryBit1, partial_carryBit2);
    return add(aT, bT, newCarryBit) + sum;
  }
  const [whole_a, decimal_a] = a.split('.');
  const [whole_b, decimal_b] = b.split('.');
  const wholeMaxLength = Math.max(whole_a.length, whole_b.length)+1;
  const decimalMaxLength = Math.max((decimal_a || '0').length, (decimal_b || '0').length);
  a = whole_a.padStart(wholeMaxLength, '0') + '.' + (decimal_a || '').padEnd(decimalMaxLength, '0');
  b = whole_b.padStart(wholeMaxLength, '0') + '.' + (decimal_b || '').padEnd(decimalMaxLength, '0');
  return add([...a].reverse(), [...b].reverse(), '0')
    .replace(/^0+/, '') // remove leading 0
    .replace(/0+$/, '') // remove trailing 0
    .replace(/\.$/, '') // remove trailing .
}

const calc = (a, b, expected) => {
  const result = strAdd(a, b);
  console.log(result, result === expected);
}

calc('10.23', '25.69', '35.92');
calc('1', '2', '3');
calc('10.3', '2', '12.3');
calc('99999', '1.01', '100000.01');
0 голосов
/ 26 сентября 2019

Вы можете использовать унарный оператор плюс (+), но в фоновом режиме он все равно преобразует строку в числа.

Пример: +string1 + +string2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...