Не выполняется функция преобразования числа в пропись на JavaScript

Проектирую бота на lowcode платформе Aimylogic. Их система упорно не хочет работать с этим кодом преобразования чисел в пропись.
Причем в песочницах он работает. Со знаками $ не очень корректно, а вот с var хорошо.

$number = 12545,34;
$prod_time = function number_to_string() {
        $arr_numbers = new Array();
        $arr_numbers[1] = new Array('', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
        $arr_numbers[2] = new Array('', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто');
        $arr_numbers[3] = new Array('', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
        function number_parser() {
                $string = '';
                $num_hundred = '';
                if ($num.length == 3) {
                        $num_hundred = $num.substr(0, 1);
                        $num = $num.substr(1, 3);
                        $string = $arr_numbers[3][$num_hundred] + ' ';
                }
                if ($num < 20) $string += $arr_numbers[1][parseFloat($num)] + ' ';
                else {
                        $first_num = $num.substr(0, 1);
                        $second_num = $num.substr(1, 2);
                        $string += $arr_numbers[2][$first_num] + ' ' + $arr_numbers[1][$second_num] + ' ';
                }              
                switch ($desc){
                        case 0:
                                $last_num = parseFloat($num.substr(-1));
                                $pre_last_num = $num.substr(-2);
                                $pre_last_num = $pre_last_num.split("");
                                $pre_last_num = parseFloat($pre_last_num[0]);
                                if ($last_num == 1 && 1!= $pre_last_num) $string += 'рубль';
                                else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'рубль';
                                else if ($last_num > 1 && $last_num < 5 && 1!= $pre_last_num)  $string += 'рубля';
                                else if ($pre_last_num.length > 1) $string += 'рублей';
                                else if ($pre_last_num.length = 1 && $last_num  > 4) $string += 'рублей';
                                else if ($pre_last_num.length = 1 && 0 == $last_num) $string += 'Ноль рублей';
                                else $string += 'рубль';
                                break;
                        case 1:
                                $last_num = parseFloat($num.substr(-1));
                                $pre_last_num = $num.substr(-2);
                                $pre_last_num = $pre_last_num.split("");
                                $pre_last_num = parseFloat($pre_last_num[0]);
                                if ($last_num == 1 && 1!= $pre_last_num) $string += 'тысяча ';
                                else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'тысяча ';
                                else if ($last_num > 1 && $last_num < 5 && 1!= $pre_last_num) $string += 'тысячи ';
                                else $string += 'тысяч ';
                                $string = $string.replace('один ', 'одна ');
                                $string = $string.replace('два ', 'две ');
                                break;
                        case 2:
                                $last_num = parseFloat(_num.substr(-1));
                                $pre_last_num = $num.substr(-2);
                                $pre_last_num = $pre_last_num.split("");
                                $pre_last_num = parseFloat($pre_last_num[0]);
                                if ($last_num == 1 && 1!= $pre_last_num) $string += 'миллион ';
                                else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'миллион ';
                                else if ($last_num > 1 && $last_num < 5 && 1!= $pre_last_num) $string += 'миллиона ';
                                else $string += 'миллионов ';
                                break;
                        case 3:
                                $last_num = parseFloat($num.substr(-1));
                                $pre_last_num = $num.substr(-2);
                                $pre_last_num = $pre_last_num.split("");
                                $pre_last_num = parseFloat($pre_last_num[0]);
                                if ($last_num == 1 && 1!= $pre_last_num) $string += 'миллиард ';
                                else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'миллиард ';
                                else if ($last_num > 1 && $last_num < 5 && 1!= $pre_last_num) $string += 'миллиарда ';
                                else $string += 'миллиардов ';
                                break;
                }
                $string = $string.replace('  ', ' ');
                return $string;
        }
        function decimals_parser() {
                $first_num = $num.substr(0, 1);
                $second_num = parseFloat($num.substr(1, 2));
                $string = ' ' + $first_num + $second_num;
                if ($second_num == 1 && 1 != $first_num) $string += ' копейка';
                else if ($second_num > 1 && $second_num < 5 && 1 != $first_num) $string += ' копейки';
                else $string += ' копеек';
                return $string;
         }
          if (!$number || $number == 0) return 'Ноль рублей';
          if (typeof $number !== 'number') {
                  $number = $number.replace(',', '.');
                  $number = parseFloat(number);
                  if (isNaN($number)) return 'Ноль рублей';
         }
        $number = $number.toFixed(2);
        if($number.indexOf('.') != -1) {
                $number_arr = $number.split('.');
                $number = $number_arr[0];
                $number_decimals = $number_arr[1];
        }
        $number_length = $number.length;
        $string = '';
        $num_parser = '';
        $count = 0;
        for ($p = ($number_length - 1); $p >= 0; $p--) {
                $num_digit = $number.substr($p, 1);
                $num_parser = $num_digit +  $num_parser;
                if (($num_parser.length == 3 || $p == 0) && !isNaN(parseFloat($num_parser))) {
                        $string = number_parser($num_parser, $count) + $string;
                        $num_parser = '';
                        $count++;
                }
        }
        if ($number_decimals) $string += decimals_parser($number_decimals);
        $string = $string.charAt(0).toUpperCase() + $string.substr(1).toLowerCase();
        return $string;
}

В общем, говорили объявить эту функцию переменной, как и сделал. Убрать аргументы тоже сделал. Все равно не отрабатывает. Выдает ошибку

RuntimeException: java.util.concurrent.ExecutionException: com.justai.zb.scenarios.errors.ScriptingException: :3 TypeError: Cannot read property "prod_time" from undefined


Ответы (1 шт):

Автор решения: Daniil Loban

RuntimeException: java.util.concurrent.ExecutionException: com.justai.zb.scenarios.errors.ScriptingException: :3 TypeError: Cannot read property "prod_time" from undefined

Буквально эта ошибка говорит от том что в сценариях произошла ошибка так как у некторорого объекта назовем его Object нет свойства prod_time т.е:

Object.prod_time === undefined // true
Object.prod_time()             // будет ошибка

Я проанализировал код функции, чтобы она заработала во вложенных функциях не хватает параметров а именно:

function number_parser($num, $desc) {...}

function decimals_parser($num) {...}

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

$number = 13545,34;
$prod_time = function number_to_string() {
        $arr_numbers = new Array();
        $arr_numbers[1] = new Array('', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
        $arr_numbers[2] = new Array('', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто');
        $arr_numbers[3] = new Array('', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
        function number_parser($num, $desc) {
                $string = '';
                $num_hundred = '';
                if ($num.length == 3) {
                        $num_hundred = $num.substr(0, 1);
                        $num = $num.substr(1, 3);
                        $string = $arr_numbers[3][$num_hundred] + ' ';
                }
                if ($num < 20) $string += $arr_numbers[1][parseFloat($num)] + ' ';
                else {
                        $first_num = $num.substr(0, 1);
                        $second_num = $num.substr(1, 2);
                        $string += $arr_numbers[2][$first_num] + ' ' + $arr_numbers[1][$second_num] + ' ';
                }              
                switch ($desc){
                        case 0:
                                $last_num = parseFloat($num.substr(-1));
                                $pre_last_num = $num.substr(-2);
                                $pre_last_num = $pre_last_num.split("");
                                $pre_last_num = parseFloat($pre_last_num[0]);
                                if ($last_num == 1 && 1!= $pre_last_num) $string += 'рубль';
                                else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'рубль';
                                else if ($last_num > 1 && $last_num < 5 && 1!= $pre_last_num)  $string += 'рубля';
                                else if ($pre_last_num.length > 1) $string += 'рублей';
                                else if ($pre_last_num.length = 1 && $last_num  > 4) $string += 'рублей';
                                else if ($pre_last_num.length = 1 && 0 == $last_num) $string += 'Ноль рублей';
                                else $string += 'рубль';
                                break;
                        case 1:
                                $last_num = parseFloat($num.substr(-1));
                                $pre_last_num = $num.substr(-2);
                                $pre_last_num = $pre_last_num.split("");
                                $pre_last_num = parseFloat($pre_last_num[0]);
                                if ($last_num == 1 && 1!= $pre_last_num) $string += 'тысяча ';
                                else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'тысяча ';
                                else if ($last_num > 1 && $last_num < 5 && 1!= $pre_last_num) $string += 'тысячи ';
                                else $string += 'тысяч ';
                                $string = $string.replace('один ', 'одна ');
                                $string = $string.replace('два ', 'две ');
                                break;
                        case 2:
                                $last_num = parseFloat(_num.substr(-1));
                                $pre_last_num = $num.substr(-2);
                                $pre_last_num = $pre_last_num.split("");
                                $pre_last_num = parseFloat($pre_last_num[0]);
                                if ($last_num == 1 && 1!= $pre_last_num) $string += 'миллион ';
                                else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'миллион ';
                                else if ($last_num > 1 && $last_num < 5 && 1!= $pre_last_num) $string += 'миллиона ';
                                else $string += 'миллионов ';
                                break;
                        case 3:
                                $last_num = parseFloat($num.substr(-1));
                                $pre_last_num = $num.substr(-2);
                                $pre_last_num = $pre_last_num.split("");
                                $pre_last_num = parseFloat($pre_last_num[0]);
                                if ($last_num == 1 && 1!= $pre_last_num) $string += 'миллиард ';
                                else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'миллиард ';
                                else if ($last_num > 1 && $last_num < 5 && 1!= $pre_last_num) $string += 'миллиарда ';
                                else $string += 'миллиардов ';
                                break;
                }
                $string = $string.replace('  ', ' ');
                return $string;
        }
        function decimals_parser($num) {
                $first_num = $num.substr(0, 1);
                $second_num = parseFloat($num.substr(1, 2));
                $string = ' ' + $first_num + $second_num;
                if ($second_num == 1 && 1 != $first_num) $string += ' копейка';
                else if ($second_num > 1 && $second_num < 5 && 1 != $first_num) $string += ' копейки';
                else $string += ' копеек';
                return $string;
         }
          if (!$number || $number == 0) return 'Ноль рублей';
          if (typeof $number !== 'number') {
                  $number = $number.replace(',', '.');
                  $number = parseFloat(number);
                  if (isNaN($number)) return 'Ноль рублей';
         }
        $number = $number.toFixed(2);
        if($number.indexOf('.') != -1) {
                $number_arr = $number.split('.');
                $number = $number_arr[0];
                $number_decimals = $number_arr[1];
        }
        $number_length = $number.length;
        $string = '';
        $num_parser = '';
        $count = 0;
        for ($p = ($number_length - 1); $p >= 0; $p--) {
                $num_digit = $number.substr($p, 1);
                $num_parser = $num_digit +  $num_parser;
                if (($num_parser.length == 3 || $p == 0) && !isNaN(parseFloat($num_parser))) {
                        $string = number_parser($num_parser, $count) + $string;
                        $num_parser = '';
                        $count++;
                }
        }
        if ($number_decimals) $string += decimals_parser($number_decimals);
        $string = $string.charAt(0).toUpperCase() + $string.substr(1).toLowerCase();
        return $string;
}

console.log($prod_time())

13545.34 -> Тринадцать тысяч тринадцать тысяч  00 копеек

Поэтому я внес правки чтобы он работал корректно и прокомментировал их в коде (так как там по месту легче понять о чем речь):

$number = 134212545.34;
$prod_time = function number_to_string() {
  $arr_numbers = new Array();
  $arr_numbers[1] = new Array('', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
  $arr_numbers[2] = new Array('', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто');
  $arr_numbers[3] = new Array('', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');

  function number_parser($num, $desc) { // нужны параметры
    let $string = ''; // должна быть локальная переменная let или var
    $num_hundred = '';
    if ($num.length == 3) {
      $num_hundred = $num.substr(0, 1);
      $num = $num.substr(1, 3);
      $string = $arr_numbers[3][$num_hundred] + ' ';
    }
    if (+$num < 20) $string += $arr_numbers[1][parseFloat($num)] + ' '; /* + сравнивать число не строку */
    else {
      $first_num = $num.substr(0, 1);
      $second_num = $num.substr(1, 2);
      $string += $arr_numbers[2][$first_num] + ' ' + $arr_numbers[1][$second_num] + ' ';
    }
    switch ($desc) {
      case 0:
        $last_num = parseFloat($num.substr(-1));
        $pre_last_num = $num.substr(-2);
        $pre_last_num = $pre_last_num.split("");
        $pre_last_num = parseFloat($pre_last_num[0]);
        if ($last_num == 1 && 1 != $pre_last_num) $string += 'рубль';
        else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'рубль';
        else if ($last_num > 1 && $last_num < 5 && 1 != $pre_last_num) $string += 'рубля';
        else if ($pre_last_num.length > 1) $string += 'рублей';
        else if ($pre_last_num.length = 1 && $last_num > 4) $string += 'рублей';
        else if ($pre_last_num.length = 1 && 0 == $last_num) $string += 'рублей'; // не 'Ноль рублей'
        else $string += 'рубль';
        break;
      case 1:
        $last_num = parseFloat($num.substr(-1));
        $pre_last_num = $num.substr(-2);
        $pre_last_num = $pre_last_num.split("");
        $pre_last_num = parseFloat($pre_last_num[0]);
        if ($last_num == 1 && 1 != $pre_last_num) $string += 'тысяча ';
        else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'тысяча ';
        else if ($last_num > 1 && $last_num < 5 && 1 != $pre_last_num) $string += 'тысячи ';
        else $string += 'тысяч ';
        $string = $string.replace('один ', 'одна ');
        $string = $string.replace('два ', 'две ');
        break;
      case 2:
        $last_num = parseFloat($num.substr(-1));
        $pre_last_num = $num.substr(-2);
        $pre_last_num = $pre_last_num.split("");
        $pre_last_num = parseFloat($pre_last_num[0]);
        if ($last_num == 1) $string += 'миллион ';
        else if ($last_num == 1 && 1 != $pre_last_num) $string += 'миллион ';
        else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'миллион ';
        else if ($last_num > 1 && $last_num < 5 && 1 != $pre_last_num) $string += 'миллиона ';
        else $string += 'миллионов ';
        break;
      case 3:
        $last_num = parseFloat($num.substr(-1));
        $pre_last_num = $num.substr(-2);
        $pre_last_num = $pre_last_num.split("");
        $pre_last_num = parseFloat($pre_last_num[0]);
        if ($last_num == 1 && 1 != $pre_last_num) $string += 'миллиард ';
        else if ($last_num == 1 && 1 == $pre_last_num.length) $string += 'миллиард ';
        else if ($last_num > 1 && $last_num < 5 && 1 != $pre_last_num) $string += 'миллиарда ';
        else $string += 'миллиардов ';
        break;
    }
    return $string;
  }

  function decimals_parser($num) { // нужны параметры
    $first_num = $num.substr(0, 1);
    $second_num = parseFloat($num.substr(1, 2));
    $string = ' ' + $first_num + $second_num;
    if ($second_num == 1 && 1 != $first_num) $string += ' копейка';
    else if ($second_num > 1 && $second_num < 5 && 1 != $first_num) $string += ' копейки';
    else $string += ' копеек';
    return $string;
  }
  if (!$number || $number == 0) return 'Ноль рублей';
  if (typeof $number !== 'number') {
    $number = $number.replace(',', '.');
    $number = parseFloat($number);
    if (isNaN($number)) return 'Ноль рублей';
  }
  $number = $number.toFixed(2);
  if ($number.indexOf('.') != -1) {
    $number_arr = $number.split('.');
    $number = $number_arr[0];
    $number_decimals = $number_arr[1];
  }
  $number_length = $number.length;
  $string = '';
  $num_parser = '';
  $count = 0;
  for ($p = ($number_length - 1); $p >= 0; $p--) {
    $num_digit = $number.substr($p, 1);
    $num_parser = $num_digit + $num_parser;
    if (($num_parser.length == 3 || $p == 0) && !isNaN(parseFloat($num_parser))) {
      $string = number_parser($num_parser, $count) + $string;
      $num_parser = '';
      $count++;
    }
  }
  if ($number_decimals) $string += decimals_parser($number_decimals, 2);
  $string = $string.charAt(0).toUpperCase() + $string.substr(1).toLowerCase();
  $string = $string.replace(/\s+/g, ' ');
  return $string;
}

console.log($prod_time())

134212545.34 -> Сто тридцать четыре миллиона 
двести двенадцать тысяч пятьсот сорок пять рублей 34 копейки

Форматирование кода можете восстановить тут укажите количество пробелов 8

→ Ссылка