У меня очень простой код и функция. Моя проблема в : я хочу выбрать последнюю цифру заданного числа, что я и сделал, но когда я хочу ее использовать, она просто не будет работать.

Моя задача в этой функции - сделать цифры более читабельными, например: если число 1 , выходной файл должен быть 1-м ; если число 3 , выходной файл должен быть 3-м ; если число 402 , выходной файл должен быть 402-м .

function humanizeChar (number) {  
var lastOne = number.toString().split('').pop();
  if (lastOne === 1) {
    return number + 'st';
  } else if (lastOne === 2) {
    return number + 'nd';
  } else if (lastOne === 3) {
    return number + 'rd';
  } else {
    return number + 'th';
  } 
}
console.log(humanizeChar(1131)); // my output is 1131th
0
Duca 10 Янв 2017 в 18:18

6 ответов

Лучший ответ

Вы пытаетесь сравнить строку (lastOne) с числом с помощью строгое равенство ===, которое сравнивает значение и тип. Вы можете использовать простое равенство == или измените числа на строки:

function humanizeChar (number) {  
  var lastOne = number.toString().split('').pop();
  console.log(lastOne);
  if (lastOne === '1') {
    return number + 'st';
  } else if (lastOne === '2') {
    return number + 'nd';
  } else if (lastOne === '3') {
    return number + 'rd';
  } else {
    return number + 'th';
  } 
}
console.log(humanizeChar(1131)); // my output is 1131th
1
Ori Drori 10 Янв 2017 в 15:20

Нам также нужно учесть 2-ую из последней цифры. Например, 101 должен быть сто первым вместо ста одиннадцатого.

//Improving from Ori Drori's answer
function humanizeChar (number) {
    var numStrs = number.toString().split('');
    var lastOne = numStrs.pop();
    var isSeondFromLastGreaterThanZero = (numStrs.length > 0 && numStrs.pop() !== '0');
    var suffix = "th";

    if (!isSeondFromLastGreaterThanZero) {
        if (lastOne === '1') {
            suffix = 'st';
        } else if (lastOne === '2') {
            suffix = 'nd';
        } else if (lastOne === '3') {
            suffix = 'rd';
        }
    }

    return number.toString() + suffix;

}
console.log(humanizeChar(1131)); // my output is 1131th
console.log(humanizeChar(1101)); // 1101st
console.log(humanizeChar(2)); // 2nd
1
Tianzhen Lin 10 Янв 2017 в 15:36

Вам нужно внести некоторые изменения в ваш код, как показано ниже: -

function humanizeChar (number) {
number = 7882;          //just give some number for checking
var lastOne = number.toString().split('').pop();
//console.log(lastOne);
  if (lastOne == 1) {
    return number + 'st';
  } else if (lastOne == 2) {
    return number + 'nd';
  } else if (lastOne == 3) {
    return number + 'rd';
  } else {
    return number + 'th';
  } 
}
console.log(humanizeChar());
1
Vishal Thakur 10 Янв 2017 в 15:37

Попробуйте, кажется, вы сравниваете выходную строку с числом:

function humanizeChar (number) {  
var lastOne = number.toString().split('').pop();
  if (lastOne === "1") {
    return number + 'st';
  } else if (lastOne === "2") {
    return number + 'nd';
  } else if (lastOne === "3") {
    return number + 'rd';
  } else {
    return number + 'th';
  } 
}
console.log(humanizeChar(1131)); // my output is 1131th
1
Rai Vu 10 Янв 2017 в 15:24

Ваша проблема в том, что вы сравниваете строки с числами, используя оператор ===. Как указано в , это очень хороший ответ для SO:

Оператор identity (===) ведет себя идентично оператору равенства (==), за исключением того, что преобразование типов не выполняется, и типы должны быть одинаковыми, чтобы считаться равными.

Таким образом, вы можете либо преобразовать ваш lastOne вручную в число (например, используя parseInt(lastOne)), либо использовать вместо него оператор ==. Или вместо этого вы можете сравнить lastOne со строковыми литералами ('1', '2', ...).

1
Community 23 Май 2017 в 12:24

Операторы сравнения JavaScript Оператор Описание == равно === равное значение и одинаковый тип

В вашем случае правильным оператором является '=='

1
ottis79 10 Янв 2017 в 15:25