Nikulio
@Nikulio
NaN !== NaN

Как поправить задачу вывода цифр в названия?

И так, задача: дается число или цифра. Нужно принять ее как аргумент и вернуть её в строковом представлении. Например, вот:
nameThatNumber(4)   // returns "four"
nameThatNumber(19)  // returns "nineteen"
nameThatNumber(99)  // returns "ninety nine"

Сейчас у меня так:
function nameThatNumber(num) {
 var digits = (""+num).split("");
  var total = '';
  for (var i = 0; i <  digits.length;i++) {
    if (digits[i] == "1") total+= 'one';
    if (digits[i] == "2") total+= 'two';
    if (digits[i] == "3") total+= 'three';
    if (digits[i] == "4") total+= 'four';
    if (digits[i] == "5") total+= 'five';
    if (digits[i] == "6") total+= 'sixth';
    if (digits[i] == "7") total+= 'seven';
    if (digits[i] == "8") total+= 'eight';
    if (digits[i] == "9") total+= 'nine';
    }
    return total
}

Основная проблема в том, что я не знаю как вывести десятки. Например, если дано 21, у меня выведет "twoone", а
нужно " twenty one"
Буду благодарен за помощь
  • Вопрос задан
  • 270 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
var nameThatNumber = function() {
  var names = {
                  10: 'ten',
    1: 'one',     11: 'eleven',
    2: 'two',     12: 'twelve',     20: 'twenty',
    3: 'three',   13: 'thirteen',   30: 'thirty',
    4: 'four',    14: 'fourteen',   40: 'fourty',
    5: 'five',    15: 'fifteen',    50: 'fifty',
    6: 'six',     16: 'sixteen',    60: 'sixty',
    7: 'seven',   17: 'seventeen',  70: 'seventy',
    8: 'eight',   18: 'eighteen',   80: 'eighty',
    9: 'nine',    19: 'nineteen',   90: 'ninety',
    100: 'hundred',
    k1: 'thousand',
    k2: 'million',
    k3: 'billion'
  };

  function stringify(num) {
    if(num < 1000) {
      return triade(num);
    }
    var triades = [];
    var n = num;
    while(n) {
      triades.push(n % 1000);
      n = Math.floor(n / 1000);
    }
    return triades.map(function(n, i) {
      var t = triade(n);
      if(t === '') {
        return '';
      }
      var nm = ' ' + (names['k' + i] || '');
      return t + nm;
    }).reverse().join(' ').replace(/\s+/g, ' ').trim();
  }

  function triade(num) {
    var n = num;
    if(n === 0) {
      return '';
    }
    if(n <= 20) {
      return names[n];
    }
    var result = '';
    if(n >= 100) {
      result = names[Math.floor(n / 100)] + ' ' + names[100];
    }
    n %= 100;
    if(n === 0) {
      return result;
    }
    if(result !== '') {
      result += ' and ';
    }
    if(n <= 20) {
      return result + names[n];
    }
    result += names[Math.floor(n / 10) * 10];
    n %= 10;
    if(n !== 0) {
      result += ' ' + names[n];
    }
    return result;
  }

  return function nameThatNumber(num) {
    var n = Math.abs(parseInt(num));
    if(isNaN(n)) {
      return 'Not a number!';
    }
    if(n === 0) {
      return 'zero';
    }
    return (num < 0 ? 'minus ' : '') + stringify(n);
  };
}();
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
FFxSquall
@FFxSquall
Могу писать код, могу не писать
почему бы не взять готовое решение? Но если очень хочется, что-то своё, можно посмотреть в реализацию.
Ответ написан
IonDen
@IonDen
JavaScript developer. IonDen.com
У этой задачи нет простого решения, вы должны выполнить набор правил для каждого порядка цифр.

Чтобы решить эту задачу, вам в начале нужно нарисовать схему, где четко расписать, в какие моменты правила меняются, какие есть исключения.

У вашей функции nameThatNumber должно быть много дочерних фукнций, которые вернут строковое представление для нужного порядка и т.д.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы