@1RONMAN

"%d День, %d дня, %d дней" в js как сделать?

Приветствую!

Прошу не пинать за нубский вопрос. :)

Имеем: виджет вордпресса, который отображает фильтр по дням (срок действия предложения) в котором можно выбирать значения от-до.

В коде выглядит следующим образом:
jQuery( '.filter-days .slider' ).slider({
    range: true,
    min: 0,
    max: 120,
    values: [ 0, 80 ],
    slide: function( event, ui ) {
      jQuery('.input-min').val( ui.values[0] );
      jQuery('.input-max').val( ui.values[1] );
      jQuery('.filter-days .info .begin').text( ui.values[0] + ( ui.values[0] != 1 ? ' дней' : ' день' ) );
      jQuery('.filter-days .info .end').text( ui.values[1] + ( ui.values[1] != 1 ? ' дней' : ' день' ) );
    }
  });

  var begin = jQuery('.filter-days .slider').slider('values', 0);
  var end = jQuery('.filter-days .slider').slider('values', 1);
  jQuery('.filter-days .info .begin').text( begin + ( begin != 1 ? ' days' : ' day' ) );
  jQuery('.filter-days .info .end').text( end + ( end != 1 ? ' days' : ' day' ) );


});


Как изменить код чтобы вся эта конструкция могла корректно работать с русским языком?! :)

В JS я полный нуб, так что прошу объяснить как ребёнку или лабрадору.)))))

Update:

Насколько я понимаю нужно добавить третье условие в этот код:

jQuery('.filter-days .info .begin').text( ui.values[0] + ( ui.values[0] != 1 ? ' дней' : ' день' ) );
    jQuery('.filter-days .info .end').text( ui.values[1] + ( ui.values[1] != 1 ? ' дней' : ' день' ) );


Update2:

В итоге решение выглядит так:

jQuery( '.filter-days .slider' ).slider({
    range: true,
    min: 0,
    max: 120,
    values: [ 22, 80 ],
    slide: function( event, ui ) {
      jQuery('.input-min').val( ui.values[0] );
      jQuery('.input-max').val( ui.values[1] );
      var f, g, h, j, k, l, m, n;
      var begin1 = (ui.values[0]);
      var end1 = (ui.values[1]);
      var j = begin1.toString();
      var g = j.substr(j.length - 1, 1); //последняя цифра она же b а f - это a а g это b
      var h = j.substr(j.length - 2, 1); //предпоследняя цифра она же c
      var n = end1.toString(10);
      var l = n.substr(j.length - 1, 1); //последняя цифра она же b а f - это a а g это b
      var m = n.substr(j.length - 2, 1); //предпоследняя цифра она же c
      if (h == 1 && j.length != 1){f = " дней"}
    	else {
    		if (g == 1){f = " день"}
    			else {
    		if (g == 2 || g == 3 || g == 4){f = " дня"}
            	else {
            f = " дней"
                 }
             }
         }  
      if (m == 1 && n.length != 1){k = " дней"}
    	else {
    		if (l == 1){k = " день"}
    			else {
    		if (l == 2 || l == 3 || l == 4){k = " дня"}
            	else {
            k = " дней"
                 }
             }
         }      
      jQuery('.filter-days .info .begin').text( (ui.values[0]) + f );
      jQuery('.filter-days .info .end').text( (ui.values[1]) + k );
    }
  });


В целом работает, но смущает 2 вещи:
Дохренища переменных. Наверняка ведь можно найти более изящное решение...но напомню - я вообще не шарю в JS :(
Вылез баг - когда первое значение уходит <10 текст для второго значения меняется на "дней"

Профи, если кто подскажет где сделал ошибку и как её исправить буду оч благодарен!

P.s. Сорри за кривенький код
  • Вопрос задан
  • 1925 просмотров
Пригласить эксперта
Ответы на вопрос 2
@1RONMAN Автор вопроса
В итоге решение выглядит так:
jQuery( '.filter-days .slider' ).slider({
    range: true,
    min: 0,
    max: 120,
    values: [ 22, 80 ],
    slide: function( event, ui ) {
      jQuery('.input-min').val( ui.values[0] );
      jQuery('.input-max').val( ui.values[1] );
      var f, g, h, j, k, l, m, n;
      var begin1 = (ui.values[0]);
      var end1 = (ui.values[1]);
      var j = begin1.toString();
      var g = j.substr(j.length - 1, 1); //последняя цифра она же b а f - это a а g это b
      var h = j.substr(j.length - 2, 1); //предпоследняя цифра она же c
      var n = end1.toString(10);
      var l = n.substr(j.length - 1, 1); //последняя цифра она же b а f - это a а g это b
      var m = n.substr(j.length - 2, 1); //предпоследняя цифра она же c
      if (h == 1 && j.length != 1){f = " дней"}
	  	else {
	  		if (g == 1){f = " день"}
	  			else {
	  		if (g == 2 || g == 3 || g == 4){f = " дня"}
            	else {
            f = " дней"
                 }
             }
         }  
      if (m == 1 && n.length != 1){k = " дней"}
	  	else {
	  		if (l == 1){k = " день"}
	  			else {
	  		if (l == 2 || l == 3 || l == 4){k = " дня"}
            	else {
            k = " дней"
                 }
             }
         }      
      jQuery('.filter-days .info .begin').text( (ui.values[0]) + f );
      jQuery('.filter-days .info .end').text( (ui.values[1]) + k );
    }
  });


В целом работает, но смущает 2 вещи:
  1. Дохренища переменных. Наверняка ведь можно найти более изящное решение...но напомню - я вообще не шарю в JS :(
  2. Вылез баг - когда первое значение уходит <10 текст для второго значения меняется на "дней"


Профи, если кто подскажет где сделал ошибку и как её исправить буду оч благодарен!

P.s. Сорри за кривенький код
Ответ написан
Комментировать
@SherzodMustafa
var days = 12;
var string = String(days).slice(-1);
var num = Number(string);
var text = '';
switch(num) {
case 1:
text = 'день';break;
case 2:
text = 'дня' ;break;
case 3:
text = 'дня' ;break;
case 4:
text = 'дня' ;break;
default:
text = 'дней';break;
}
if(days==11||days==12||days==13||days==14){ text = 'дней';}
console.log( days+text );
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы