Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.06.2018, 13:09
dTM dTM вне форума
Новичок на форуме
Отправить личное сообщение для dTM Посмотреть профиль Найти все сообщения от dTM
 
Регистрация: 13.06.2018
Сообщений: 7

Проблема с вызовом элемента массива в скрипте
Суть проблемы следующая, есть скрипт (я знаю что сам скрипт кривой, запутанный и прочее, я новичок в изучении JS, и решал задачку сам как мог):

function NumPerString(numb) {
	let units = ['Один','Два','Три','Четыре','Пять','Шесть','Семь','Восемь','Девять','Десять', 'Одинадцать', 'Двенадцать', 'Тринадцать', 
				'Четырнадцать', 'Пятнадцать', 'Шестнадцать', 'Семьнадцать', 'Восемнадцать', 'Девятнадцать'],
		dozenOf = ['Двадцать', 'Тридцать', 'Сорок', 'Пятьдесят', 'Шестьдесят', 'Семдесят', 'Восемдесят', 'Девяносто'],
		hundreds = ['Сто', 'Двести', 'Триста', 'Четыреста', 'Пятьсот', 'Шестьсот', 'Семьсот', 'Восемьсот', 'Девятьсот'],
		thousands = ['Тысяча', 'Тысячи', 'Тысяч'],
		millions = ['Миллион', 'Милиона', 'Миллионов'],
		numerator = ['Одна', 'Две'];
	if (numb < 0 || numb > 999999999) {
		return 'Не коректное число!<br>';
	} else if (numb == '' || isNaN(numb) || numb == 0) {
		return 'Ноль';
	} else if (numb > 0 && numb < 20 ) {
		return units[numb-1];
	} else if (numb > 19 && numb < 100) {
		if (numb % 10 === 0) {
			return dozenOf[Math.floor((numb / 10) - 2)];
		} else if (numb % 10 != 0) {
			return dozenOf[Math.floor((numb / 10) - 2)] + ' ' + units[(numb%10) - 1];
		}
	} else if (numb > 99 && numb < 1000) {
		if (numb % 100 === 0) {
			return hundreds[Math.floor((numb / 100) - 1)];
		} else if (numb % 100 != 0) {
			if (numb%100 > 0 && numb%100 < 20 ) {
				return hundreds[Math.floor((numb / 100) - 1)] + ' ' + units[Math.floor(numb%100-1)];
			} else if (numb%100 > 19 && (numb%100)%10===0) {
				return hundreds[Math.floor((numb / 100) - 1)] + ' ' + dozenOf[Math.floor((numb%100)/10 - 2)];				
			} else if (numb%100 > 20 && (numb%100) % 10 != 0) {
				return hundreds[Math.floor((numb / 100) - 1)] + ' ' + dozenOf[Math.floor((numb%100)/10 - 2)] + ' ' + units[Math.floor(((numb%100)%10)-1)];
			}
		}
	} else if (numb === 1000) {
		return numerator[numb/1000-1]+ ' ' + thousands[numb/1000-1];		
	} else if (numb > 1000 && numb < 2000) {
		if (numb%1000 > 0 && numb%1000 < 20) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' +units[Math.floor(numb%1000-1)];
		} else if (numb%1000 > 19 && (numb%100)%10===0) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' +dozenOf[Math.floor((numb%1000)/10 - 2)];			
		} else if (numb%1000 > 99 && (numb%1000)%100===0) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' + hundreds[Math.floor(((numb%1000)/100)-1)];			
		} else if (numb%1000 > 20 && (numb%1000) % 10 != 0) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' + dozenOf[Math.floor((numb%1000)/10 - 2)] + ' ' + units[Math.floor(((numb%1000)%10)-1)];
		} else if ((numb%1000) > 100 && (numb%1000) < 120) {
			return numerator[Math.floor(numb/1000-1)]+ ' ' + thousands[Math.floor(numb/1000-1)]+ ' ' +hundreds[Math.floor(numb%1000/100-1)]+ ' ' +units[Math.floor((numb%1000)%100-1)];
		}
	}
}
console.log(NumPerString(1100));


Проблема заключается в том, что в строках 41 и 45 вызов к элементу массива hundreds не работает, и выдает undefined. Сама формула, проверена в консоли и точно выдает 0, что должно по идеи выводить нулевой элемент массива. И даже при замене самой формулы, на hundreds[0], все равно выдает undefined.
Кто знает в чем именно ошибка, и как её исправить и избежать, подскажите пожалуйста новичку.

P.S. Большая просьба, с ответами типа скрипт плохой, ссылками или примерами более продвинутых скриптов, не писать, мне интересна именно в чем причина ошибки, и если можно человеческим языком, и как её решить, если она вообще решаема.

Заранее большое спасибо за ответы.

Последний раз редактировалось dTM, 13.06.2018 в 13:15.
Ответить с цитированием
  #2 (permalink)  
Старый 13.06.2018, 13:14
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,797

Выведите в консоль массив "hundreds" и ключ, после смотрите есть в массиве этот ключ или нет.
Ответить с цитированием
  #3 (permalink)  
Старый 13.06.2018, 13:18
dTM dTM вне форума
Новичок на форуме
Отправить личное сообщение для dTM Посмотреть профиль Найти все сообщения от dTM
 
Регистрация: 13.06.2018
Сообщений: 7

Массив "hundreds" в выводе сотен вполне себе отвечает. И выводит нужный элемент, проблема именно с выводом элемента в тысячах и указаны строки.

Проверил:

function NumPerString(numb) {
	let hundreds = ['Сто', 'Двести', 'Триста', 'Четыреста', 'Пятьсот', 'Шестьсот', 'Семьсот', 'Восемьсот', 'Девятьсот'];
		
 return console.log(hundreds[numb%1000/100-1]);
}
console.log(NumPerString(1100));


Все работает из массива достает первый элемент, второй и т.д., но в самом скрипте нет.

Последний раз редактировалось dTM, 13.06.2018 в 13:24.
Ответить с цитированием
  #4 (permalink)  
Старый 13.06.2018, 13:39
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,797

dTM, так вы в самом скрипте и выводите данные в консоль...
Ответить с цитированием
  #5 (permalink)  
Старый 13.06.2018, 13:44
dTM dTM вне форума
Новичок на форуме
Отправить личное сообщение для dTM Посмотреть профиль Найти все сообщения от dTM
 
Регистрация: 13.06.2018
Сообщений: 7

Сообщение от Nexus Посмотреть сообщение
dTM, так вы в самом скрипте и выводите данные в консоль...
Я проверял и без вывода консоли в скрипте, все работает, все находит, есть в hundreds элемент с ключом 0. Проблема в том, что оно не работает в самом скрипте, в определенном месте, и определенный массив, почему не понятно.
Ответить с цитированием
  #6 (permalink)  
Старый 13.06.2018, 13:52
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

dTM,
у вас в 39 строке которая и срабатывает при таком числе, сотни отсутствуют надо добавить что-то типа
hundreds[Math.floor((numb%1000)/100 - 1)]
Ответить с цитированием
  #7 (permalink)  
Старый 13.06.2018, 13:54
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

видимо условия неполные, скрипт заходит не в ту ветку, которую вам нужно
Ответить с цитированием
  #8 (permalink)  
Старый 13.06.2018, 14:01
dTM dTM вне форума
Новичок на форуме
Отправить личное сообщение для dTM Посмотреть профиль Найти все сообщения от dTM
 
Регистрация: 13.06.2018
Сообщений: 7

Сообщение от j0hnik Посмотреть сообщение
dTM,
у вас в 39 строке которая и срабатывает при таком числе, сотни отсутствуют надо добавить что-то типа
hundreds[Math.floor((numb%1000)/100 - 1)]
Все я понял ошибку, Большое Спасибо!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элемента массива без сдвига индексов preproger Общие вопросы Javascript 6 06.03.2015 17:50
Как узнать id элемента массива ArtemGavrilenko Элементы интерфейса 4 28.05.2014 13:42
Помогу получить индекс элемента массива visman Javascript под браузер 7 03.05.2014 03:23
Проверка длинны элемента массива. ViseNupper Общие вопросы Javascript 2 25.04.2014 14:29
Проблема с кодировкой в скрипте автозаполнения Maratka AJAX и COMET 12 24.01.2009 12:31