Reputation: 271
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
Reputation: 44376
You were almost there. Everything except:
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
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
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.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.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
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