user2623706
user2623706

Reputation: 527

Insert dashes into a number

Any ideas on the following? I want to input a number into a function and insert dashes "-" between the odd digits. So 4567897 would become "456789-7". What I have so far is to convert the number into a string and then an array, then look for two odd numbers in a row and use the .splice() method to add the dashes where appropriate. It does not work and I figure I may not be on the right track anyway, and that there has to be a simpler solution.

function DashInsert(num) { 
  var numArr = num.toString().split('');

    for (var i = 0; i < numArr.length; i++){
    if (numArr[i]%2 != 0){
      if (numArr[i+1]%2 != 0) {
          numArr.splice(i, 0, "-");
          }
        }
  }  
  return numArr;      
}

Upvotes: 3

Views: 3787

Answers (5)

catie
catie

Reputation: 61

    function dashInsert(str) {
       var arrayNumbers = str.split("");
       var newString = "";
       for (var i = 0; i < arrayNumbers.length; i++){
           if(arrayNumbers[i] % 2 === 1 && arrayNumbers[i + 1] % 2 === 1){
               newString = newString + arrayNumbers[i] + "-";
           } else {
               newString = newString + arrayNumbers[i];
           }
       }
       return newString;
   }

   var result = dashInsert("3453246");
   console.log(result);

Upvotes: 0

shyam
shyam

Reputation: 9368

You can try using regular expressions

'4567897'.replace(/([13579])(?=[13579])/g, '$1-')

Regex Explained

So, we find an odd number (([13579]) is a capturing group meaning we can use it as a reference in the replacement $1) ensure that it is followed by another odd number in the non-capturing positive lookahead ((?=[13579])) and replace the matched odd number adding the - prefix

Upvotes: 2

lnrael
lnrael

Reputation: 1

Edit: OrangeDog's answer was posted earlier (by nearly a full half hour), I just wanted to make an answer which uses your code since you're almost there. Using another array instead of splicing into one you were looping through (this happens to return a string using join):

var num = 4567897;


function DashInsert(num) { 
    var numArr = num.toString().split('');

    var len = numArr.length;
    var final = [];
    for (var i = 0; i < len; i++){
        final.push(numArr[i]);
        if (numArr[i]%2 != 0){
            if (i+1 < len && numArr[i+1]%2 != 0) {
                final.push("-")
            }
        }
    }  
  return final.join("");
}

alert(DashInsert(num));

Upvotes: 0

HighHopes
HighHopes

Reputation: 2112

Here is the function to do it:

function dashes(number){
    var numString = '';
    var numArr = number.toString().split('');
    console.log(numArr);
    for(i = 0; i < numArr.length; i++){
        if(numArr[i] % 2 === 1 && numArr[i+1] % 2 === 1){
            numString += numArr[i] + '-';            
        }else{
            numString += numArr[i];
        }
    }
    console.log(numString);
}


dashes(456379);

Tested and everything.

Upvotes: 0

OrangeDog
OrangeDog

Reputation: 38836

The problem is you're changing the thing you're iterating over. If instead you maintain a separate output and input...

function insertDashes(num) {
  var inStr = String(num);
  var outStr = inStr[0], ii;

  for (ii = 1; ii < inStr.length; ii++) {
    if (inStr[ii-1] % 2 !== 0 && inStr[ii] % 2 !== 0) {
      outStr += '-';
    }

    outStr += inStr[ii];
  }

  return outStr;
}

Upvotes: 2

Related Questions