imnothardcore
imnothardcore

Reputation: 271

having some javascript trouble, for loop. turning a number into its string value

I am looking to make a program that will concotate(sp?) a real number no matter the length into a string. for these purposes 1234 is fine turning into "one""two""three""four" or "onetwothreefour" or w/e. I was attempting to do this by iterating through the real number and then go through the array. my output in node is undefined through my console.log()'s shown below. Not really too sure what to do since Im new to this any help is greatly appreciated.

var datArray = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]

var toEnglish = function (number) {
    for ( var i = 0; i <= number.length; i++ ) {
        var newNumber = datArray[number[i]];
        newNumber = newNumber + newNumber;
    }
    console.log(newNumber);
    return newNumber;
}
toEnglish(1234); 

Upvotes: 1

Views: 108

Answers (4)

Michael Lorton
Michael Lorton

Reputation: 44376

You were almost there. Everything except:

  • you have to change the number into a string
  • you have to not reassign newNumber every time
  • you have to use a strict less-than comparison in the loop

So

var datArray = ["zero", "one", "two", "three", "four", 
                "five", "six", "seven", "eight", "nine"];

var toEnglish = function (number) {
  number = number.toString();
  var newNumber = "";
  for ( var i = 0; i < number.length; i++ ) {
    newNumber += datArray[number[i]];
  }
  return newNumber;
}
toEnglish(1234); 

Edit

A far more functional and terse version would be

var toEnglish = function (number) {
  return number.toString().split('').map(function(i) {
    return datArray[i]
  }).join(' ');
};

This assumes a version of Javascript that has map built in, but almost every library (jQuery, underscore, &c.) will have some equivalent.

In fact, if you are sure of a really advanced version of Javascript (e.g. in Firefox), you can write it as

var toEnglish = function (number) {
  return number.toString().split('').map(i => datArray[i]).join(' ');
}

Shweet.

Upvotes: 3

user12121234
user12121234

Reputation: 2569

Something like this might work, but I see there are a number of answers already so whatever. Thanks for the coding exercise.

var datArray = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]

var toEnglish = function (number) {
    var exploded = number.toString().split("");

    var newNumber = "";
    exploded.forEach(function(number) {
      newNumber += datArray[ number ];
    });

    // for ( var i = 0; i <= number.length; i++ ) {
    //     var newNumber = datArray[number[i]];
    //     newNumber = newNumber + newNumber;
    // }
    console.log('newNumber', newNumber);
    return newNumber;
}
toEnglish(1234); 

Upvotes: 0

Bergi
Bergi

Reputation: 664385

Three things:

  • number is a number and does not have a .length property. Pass a string like "1234" instead, or cast your argument to a string.
  • You're producing newNumber by only doubling up the word for the current digit, overwriting previous results and only returning the last. Instead, initialise with the empty string and repeatedly concat to it.
  • The loop must not run up to the length of the input but one below, as sequences are indexed from 0 to n-1.

function toEnglish(number) {
    number = String(number);
    var newNumber = "";
    for (var i = 0; i < number.length; i++) {
        newNumber += datArray[number[i]];
    }
    return newNumber;
}
console.log(toEnglish(1234)); 

Upvotes: 0

h2ooooooo
h2ooooooo

Reputation: 39532

A number does not have a length:

> console.log(1234.length);
< undefined

You must first convert it to a string:

> console.log(String(1234).length);
< 4

You also keep resetting newNumber so instead I've used an array and appended items to that (so we can join using a seperator if we wish). Lastly, I've removed <= number.length in your loop and replaced it by < number.length as otherwise we use a character that doesn't exist. Hence your code can be converted into the following:

var datArray = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]

var toEnglish = function (number) {
    number = String(number); // Cast it

    var result = [];

    for ( var i = 0; i < number.length; i++ ) {
        result.push(datArray[number[i]]); // Add the text to result
    }

    return result.join(' '); // Return the results seperated by space
}

Usage:

> toEnglish(1234); 
< "one two three four"

Upvotes: 0

Related Questions