Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как получить преобразованное в текст число но в стиле Vanilla js? (https://javascript.ru/forum/dom-window/85230-kak-poluchit-preobrazovannoe-v-tekst-chislo-no-v-stile-vanilla-js.html)

WebMachine 19.05.2023 21:02

Как получить преобразованное в текст число но в стиле Vanilla js?
 
Как получить преобразованное в текст число но в стиле Vanilla js?

const numb900 = [100, 200, 300, 400, 500, 600, 700, 800, 900];
const numb90 = [10, 20, 30, 40, 50, 60, 70, 80, 90];
const numb9 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const numb19 = [11, 12, 13, 14, 15, 16, 17, 18, 19];

const string900 = ['сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'];
const string90 = ['десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'];
const string9 = ['один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'];
const string19 = ['одиннацать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'];

function transformation(number){
    for(i = 0; i < 9; i++){
        if(numb900[i] == number){
            return string900[i];
        } else if(numb90[i] == number){
            return string90[i];
        } else if(numb9[i] == number){
            return string9[i];
        } else if(numb19[i] == number){
            return string19[i];
        }
    }
}
console.log(transformation(200)); // Например 200 = двести, или 448 = четыреста сорок восемь

рони 19.05.2023 21:11

WebMachine,
https://javascript.ru/forum/misc/406...tml#post384765

WebMachine 19.05.2023 22:30

Так это же не Vanilla js .. Рони, немного обновил код, но все равно не понимаю как соединить сотню с десяткой и единицей? Подскажешь?

WebMachine 19.05.2023 22:31

Цитата:

Сообщение от рони (Сообщение 551960)

Мне нужно Ванильное решение Рони. В целом супер но решение должно быть простое..

рони 19.05.2023 22:56

Цитата:

Сообщение от WebMachine
Так это же не Vanilla js ..

???

рони 19.05.2023 23:40

WebMachine,
при желании, код можно оптимизировать...
<body>
    <meta charset="utf-8">
    <script>
        const numb900 = [100, 200, 300, 400, 500, 600, 700, 800, 900];
        const numb90 = [10, 20, 30, 40, 50, 60, 70, 80, 90];
        const numb9 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
        const numb19 = [11, 12, 13, 14, 15, 16, 17, 18, 19];
        const string900 = ['сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'];
        const string90 = ['десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'];
        const string9 = ['один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'];
        const string19 = ['одиннацать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'];

        function transformation(number) {
            if (number > 999) return '&infin;';
            let str = '';
            let num = number % 100;
            let i = numb19.findIndex(a => a == num);
            if (i !== -1) {
                number -= num;
                str = string19[i];
                i = numb900.findIndex(a => a == number);
                return i !== -1 ? `${string900[i]} ${str}` : str;
            } else {
                let num = number % 10;
                let i = numb9.findIndex(a => a == num);
                if (i !== -1) {
                    number -= num;
                    str = string9[i];
                    if (!number) return str;
                    num = number % 100;
                    i = numb90.findIndex(a => a == num);
                    if (i !== -1) {
                        number -= num;
                        str = `${string90[i]} ${str}`;
                        if (!number) return str;
                        i = numb900.findIndex(a => a == number);
                        return `${string900[i]} ${str}`
                    }
                    i = numb900.findIndex(a => a == number);
                    return `${string900[i]} ${str}`
                } else {
                    let num = number % 100;
                    let i = numb90.findIndex(a => a == num);
                    if (i !== -1) str = string90[i];
                    number -= num;
                    if (!number) return str;
                    i = numb900.findIndex(a => a == number);
                    return `${string900[i]} ${str}`;
                }
            }
        }
        for (let i = 1; i < 1000; i++) document.write(`${i} ${transformation(i)} <br>`)
    </script>
</body>

WebMachine 22.05.2023 03:26

Цитата:

Сообщение от рони (Сообщение 551967)
WebMachine,
при желании, код можно оптимизировать...

Вариант бомба Рони. Если бы я искал лучшее решение то на нём бы я и остановился.. Но тут немного другая ситуация.

Задача такая, нужно написать скрипт который сможет преобразовывать любые числа от -999 до 999. Включая 0.

voraa 22.05.2023 09:49

Может так
const oneText = ['','один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'];
const elvText = ['десять', 'одиннацать', 'двенадцать','тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'];
const tanText = ['', '','двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'];
const hunText = ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'];
 
function transform(number){
	let neg = false;
	if (number < 0) {
		neg = true;
		number = - number;
	}
	if (number >=1000) return '';
	if (number === 0) return 'ноль';
	const rez = [];
	if (neg) rez.push ('минус')
	
	const h = (number / 100) | 0;
	number = number % 100;
	const d = (number / 10) | 0;
	const n = number % 10;
	if (h > 0) rez.push (hunText[h])
	if (d === 1) {
		rez.push (elvText[n])
	} else {
		if (d > 0) rez.push (tanText[d])
		if (n > 0) rez.push (oneText[n])
		
	}
	return rez.join(' ');
}

console.log (transform(0));
console.log (transform(5));
console.log (transform(10));
console.log (transform(17));
console.log (transform(30));
console.log (transform(42));
console.log (transform(100));
console.log (transform(214));
console.log (transform(473));
console.log (transform(-100));
console.log (transform(-214));
console.log (transform(-473));

WebMachine 22.05.2023 10:59

Цитата:

Сообщение от voraa (Сообщение 552006)
Может так

Тоже бомбовый вариант, но мне не отходя от методов надо.

voraa 22.05.2023 11:09

Сори.
Могу решать задачи только своим уровнем.
Даже не знаю, куда тут цикл присобачить.

WebMachine 22.05.2023 11:13

Цитата:

Сообщение от voraa (Сообщение 552009)
Сори.

Понимаю) не за что извинятся. Я очень благодарен за попытку помочь. Спасибо вам. Мой поклон
:thanks:

WebMachine 22.05.2023 13:03

const oneNumb = [0,1,2,3,4,5,6,7,8,9];
const elvNumb = ['', 11, 12, 13, 14, 15, 16, 17, 18, 19];
const tanNumb = ['', 10, 20, 30, 40, 50, 60, 70, 80, 90];
const hunNumb = ['', 100, 200, 300, 400, 500, 600, 700, 800, 900];
const oneText = ['ноль','один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'];
const elvText = ['', 'одиннацать', 'двенадцать','тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'];
const tanText = ['', 'десять','двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'];
const hunText = ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'];

function transform(number){
   const circle = Math.trunc(number/10); // полученаем целую часть числа при делении на 10
   const remaind = number % 10; // полученаем остаток от деления на 10
   const circle100 = Math.trunc(number/100); // полученаем целую часть числа при делении на 100
   const remaind100 = number % 100; // полученаем остаток от деления на 100
   const circleOfCircle = Math.trunc(remaind100/10); // полученаем целую часть остатка при делении на 10
   const remaindOfRemaild = remaind100 % 10; // полученаем остаток от остатка деления на 10
   const numbAbs = Math.abs(number); // получение положительных чисел из отрицательных
   let sign = true; // переменная для хранения знака (+) или (-). По умолчанию = (+) !
   if(number < 0){sign = false}; // если число меньше нуля, то знак (-) !
   for(let i=0; i <= 10; i++){
      // от 1, 2, 3 и тд, до 9 (полож-е числа !!!)
      if(number >= 0 && number <= 9 && oneNumb[i] == number){
         answerField.innerText = `Вы загадали число ${oneText[i]} ?`
      }
      // от -1, -2, -3 и тд, до -9 (отриц-е числа !!!)
      if(!sign && numbAbs == oneNumb[i]){
         answerField.innerText = `Вы загадали число минус ${oneText[i]} ?`
      }
      // от 11, 12, 13 и тд, до 19 (полож-е числа !!!)
      if(number >= 11 && number <= 19 && elvNumb[i] == number){
         answerField.innerText = `Вы загадали число ${elvText[i]} ?`
      }
      // от -11, -12, -13 и тд, до -19 (отриц-е числа !!!)
      if(!sign && numbAbs == elvNumb[i]){
         answerField.innerText = `Вы загадали число минус ${elvText[i]} ?`
      }
      // от 10, 20, 30 и тд, до 90 (полож-е числа !!!)
      if(number >= 10 && number <= 90 && tanNumb[i] == number){
         answerField.innerText = `Вы загадали число ${tanText[i]} ?`
      }
      // от -10, -20, -30 и тд, до -90 (отриц-е числа !!!)
      if(!sign && numbAbs == tanNumb[i]){
         answerField.innerText = `Вы загадали число минус ${tanText[i]} ?`
      }
      // от 100, 200, 300 и тд, до 900 (полож-е числа !!!)
      if(number >= 100 && number <= 900 && hunNumb[i] == number){
         answerField.innerText = `Вы загадали число ${hunText[i]} ?`
      }
      // от -100, -200, -300 и тд, до -900 (отриц-е числа !!!)
      if(!sign && numbAbs == hunNumb[i]){
         answerField.innerText = `Вы загадали число минус ${hunText[i]} ?`
      }
      if(numbAbs >= 21 && numbAbs <= 99 && remaind !== 0){
         for(o = 0; o <= 10; o++){
            // от 21, 32, 67 и тд, до 99 (получение полож-х чисел с остатком от 21 до 99)
            if(circle == oneNumb[i] && remaind == oneNumb[o]){
               answerField.innerText = `Вы загадали число ${tanText[i]} ${oneText[o]} ?`
            }
            // от -21, -32, -67 и тд, до -99 (получение отриц-х чисел с остатком от 21 до 99)
            if(!sign && Math.abs(circle) == oneNumb[i] && Math.abs(remaind) == oneNumb[o]){
               answerField.innerText = `Вы загадали число минус ${tanText[i]} ${oneText[o]} ?`
            }
         }
      }
      // Преобразование трёх значного числа в текст. Например 374 (как: триста, семьдесят, четыре)
      if(numbAbs >= 101 && numbAbs <= 999){
         for(k = 0; k <= 10; k++){
            for(j = 0; j <= 10; j++){
               // от 101-109, 201-209, 301-309 и тд, до 901-909 (полож-е числа !!!)
               if(remaind100 >= 1 && remaind100 <= 9){
                  if(circle100 == oneNumb[i] && circleOfCircle == oneNumb[k]){
                     if(remaindOfRemaild == oneNumb[j]){
                        answerField.innerText = `Вы загадали число ${hunText[i]} ${oneText[j]} ?`
                     }
                  }
               }
               // от 101-109, 201-209, 301-309 и тд, до 901-909 (отриц-е числа !!!)
               if(Math.abs(remaind100) >= 1 && Math.abs(remaind100) <= 9){
                  if(!sign && Math.abs(circle100) == oneNumb[i] && Math.abs(circleOfCircle) == oneNumb[k]){
                     if(Math.abs(remaindOfRemaild) == oneNumb[j]){
                        answerField.innerText = `Вы загадали число минус ${hunText[i]} ${oneText[j]} ?`
                     }   
                  }  
               }
               // от 121, 122, 123 и тд, до 999 (полож-е числа !!!)
               if(remaind100 >= 21 && remaind100 <= 99){
                  if(circle100 == oneNumb[i] && circleOfCircle == oneNumb[k]){
                     if(remaindOfRemaild == oneNumb[j]){
                        answerField.innerText = `Вы загадали число ${hunText[i]} ${tanText[k]} ${oneText[j]} ?`
                     };
                  };
               }
               // от -121, -122, -123 и тд, до -999 (отриц-е числа !!!)
               if(Math.abs(remaind100) >= 21 && Math.abs(remaind100) <= 99){
                  if(!sign && Math.abs(circle100) == oneNumb[i] && Math.abs(circleOfCircle) == oneNumb[k]){
                     if(Math.abs(remaindOfRemaild) == oneNumb[j]){
                        answerField.innerText = `Вы загадали число минус ${hunText[i]} ${tanText[k]} ${oneText[j]} ?`
                     };
                  };
               }
            }
            // от 111-119, 211-219, 311-319 и тд, до 911-919 (полож-е числа !!!)
            if(remaind100 >= 11 && remaind100 <= 19){
               if(circle100 == oneNumb[i] && remaind100 == elvNumb[k]){
                  answerField.innerText = `Вы загадали число ${hunText[i]} ${elvText[k]} ?`
               }
            }
            // от 111-119, 211-219, 311-319 и тд, до 911-919 (отриц-е числа !!!)
            if(Math.abs(remaind100) >= 11 && Math.abs(remaind100) <= 19){
               if(!sign && Math.abs(circle100) == oneNumb[i] && Math.abs(remaind100) == elvNumb[k]){
                  answerField.innerText = `Вы загадали число минус ${hunText[i]} ${elvText[k]} ?`
               }
            }
            // от 110-190, 210-290, 310-390 и тд, до 910-990 (полож-е числа !!!)
            if(remaind100 >= 10 && remaind100 <= 90){
               if(circle100 == oneNumb[i] && remaind100 == tanNumb[k]){
                  answerField.innerText = `Вы загадали число ${hunText[i]} ${tanText[k]} ?`
               }
            }
            // от 110-190, 210-290, 310-390 и тд, до 910-990 (отриц-е числа !!!)
            if(Math.abs(remaind100) >= 10 && Math.abs(remaind100) <= 90){
               if(!sign && Math.abs(circle100) == oneNumb[i] && Math.abs(remaind100) == tanNumb[k]){
                  answerField.innerText = `Вы загадали число минус ${hunText[i]} ${tanText[k]} ?`
               }
            }
         }
      }
   }
};
transform(50); // Указываем любое число от -999 до 999 . Включая 0


В общем решил задачу так. Если кому интересно будет) буду благодарен за +


Часовой пояс GMT +3, время: 18:08.