Помоги с алгоритмом, который обращает числа в слова в язык сценариев JavaScript

Я нахожусь в проекте делания книжного магазина в языке сценариев JavaScript.

https://github.com/gpincheiraa/number2words

Говорится о том, чтобы обращать числа в слова.

Был сделан suite тест и у меня есть проблемы с числами, превосходящими тысячу биллионов, он не берет последние три числа.

Пример

number: Данный неудар в лунку.

chunk_index: Индекс проанализированного chunk.

total_chunks: Общее количество chunks, которое нужно анализировать. Он проходит как аргумент, чтобы избегать повторно вычислять эту стоимость в будущих повторениях.

converted_text: Частичный исчисленный текст.

flag: Предупреди, что предстоящего постустановленного будет тысячи, чтобы это применять в числах, превосходящих 1 миллион.

Код:

function convert(number, chunk_index, total_chunks, converted_text, flag){
    //**********      VARIABLES INICIALES  ********************************
    var chunk_regex = /\d{1,3}(?=(\d{3})*$)/g, 
        text = converted_text || '',
        chunk,
        chunk_number,
        chunk_block;
    //***********     VALIDACIÓN Y SANITIZACIÓN DE FORMATO *******************

    number += '';
    //**********       INICIALIZACIONES  **********************
    total_chunks = total_chunks || Math.ceil(number.length/3);
    chunk_index = chunk_index || 0;
    //Tomamos el match correspondiente al índice que la función recursiva está analizando. 
    //Aprovechamos de aplicar el operador ++. Este operador es un shortcut para aplicar la operación ++ en la línea siguiente.

    chunk = (number).match(chunk_regex)[chunk_index++];
    chunk_number = parseInt(chunk, 10);
    //Calculamos el bloque correspondiente al exponente del número.
    chunk_block = total_chunks - chunk_index;
    //************   LÓGICA DE CONVERSIÓN **********************
    //Le aplicamos al chunk analizado las reglas ortográficas
    if(!(chunk_block > 0 && chunk_number === 0) && !(chunk_block % 2 !== 0 && chunk_number === 1)){
      text+=' <br> A: ' + chunk + ' ' + chunk_index + ' ' + total_chunks + ' ' + chunk_block + ' \n';
      console.log('A: ' + chunk, chunk_index, total_chunks, chunk_block + ' \n')
      //document.getElementById("demo").innerHTML = text;
    }
    //Definimos si es necesario agregar postfijo al texto resultante que se aplicaron las reglas.
    if(chunk_block > 0 || flag === 1){
      text+=' <br> B: ' + chunk_block + ' ' + chunk_number + ' ' + chunk_index + ' ' + flag + ' \n';
      console.log('B: ' + chunk_block, chunk_number, chunk_index,flag + ' \n')
      //document.getElementById("demo").innerHTML = text;
      flag = 0;
      //Si el siguiente número postfijo es "mil", entra esta y en la proxima iteración de la recursión, este tendrá el postfijo plural
      //(inclusive si es 0)
      if(chunk_block > 3 && chunk_block * 3 % 3 === 0 && chunk_block * 3 % 2 !== 0 && chunk_number > 0){
        flag = true;
      }
    }
    //************   RECURSIVIDAD **********************
    //Consultamos si la función recursiva debe terminar de invocarse
    if(chunk_index === total_chunks){
      document.getElementById("demo").innerHTML = text;
    }
    else{
      return convert(number, chunk_index, total_chunks, text, flag);
    }
}

convert(123456789123456789);
4
задан 25.01.2017, 02:24
0 ответов

Проблема зиждится на том, чтобы в Javascript самое большое целое число, которое возможно представлять с примитивным типом Number, было 9007199254740991, которые ты это можешь консультировать в постоянной величине Number.MAX_SAFE_INTEGER. А следовательно, если ты даешь ему большую стоимость, не моги сохранять это в памяти и он это отсекает.

Как решение советовало тебе брать неудар в лунку как цепь текста, и если Ваша длина больше 16 тогда делить ее и относиться к кускам по отдельности.

Ты снабжаешь ссылками: ECMA Section 8.5 - Numbers и Number. MAX_SAFE_INTEGER

6
ответ дан 03.12.2019, 17:40
  • 1
    Превосходный ответ! Спасибо за enseñ ar. –  26.01.2017, 03:49
  • 2
    Большое спасибо, leeré ссылки, большой вклад! –  28.01.2017, 14:47