0

I am trying to convert incoming values as below

Example: Input: 00000016B Output: 000000162

Whenever I see a "Character" from below table at the last character of a incoming input value, I need to convert as per below table.

1.My Input "00000016B" changed to "000000162" as B should be replaced by "+2", so the input is a positive number and last character should be a "2"

2.My Input "00000016K" changed to "-000000162" as K should be replaced by "-2", so the input is a negative number and last character should be a "2"

| Character | Value  |
| --------  | -------|
| {         | +0     |
| A         | +1     |
| B         | +2     |
| C         | +3     |
| D         | +4     |
| E         | +5     |
| F         | +6     |
| G         | +7     |
| H         | +8     |
| I         | +9     |
| }         | -0     |
| J         | -1     |
| K         | -2     |
| L         | -3     |
| M         | -4     |
| N         | -5     |
| O         | -6     |
| P         | -7     |
| Q         | -8     |
| R         | -9     |

I tried below code


    String.prototype.replaceAll = function(search, replacement) {
        var target = this;
        return target.replace(new RegExp(search, 'g'), replacement);
    };
    
    function replaceAll(QtyProcess, map){
        for(key in map){
            QtyProcess = QtyProcess.replaceAll(key, map[key]);
        }
        return QtyProcess;
    }
    
    var QtyProcess =  QtyTireDate.substr(8,9);
    var map = {
            '{': '+0',
            'A': '+1',
            'B': '+2',
            'C': '+3',
            'D': '+4',
            'E': '+5',
            'F': '+6',
            'G': '+7',
            'H': '+8',
            'I': '+9',
            '}': '-0',
            'J': '-1',
            'K': '-2',
            'L': '-3',
            'M': '-4',
            'N': '-5',
            'O': '-6',
            'P': '-7',
            'Q': '-8',
            'R': '-9'
    };
    var lastChar= replaceAll(QtyProcess, map);
    
    var lastNum = QtyProcess.substr (0,QtyProcess.length -1);
    
    if (lastChar.substr(0,1) == "-") {
      var QTYFinal = '-'+lastNum.concat(lastChar.substr(1,1));
    
    } else {
      var QTYFinal = lastNum.concat(lastChar.substr(1,1));
    
    }

It always gives me zero at the end

2
  • So you are replacing only the last character or can the letters be anywhere in the string? Commented Apr 16, 2021 at 16:38
  • Just the last character, and then based on if its negative I have to make it a negative number Commented Apr 16, 2021 at 16:40

5 Answers 5

2

This should work for you:

var map = {
    "{": "+0",
    A: "+1",
    B: "+2",
    C: "+3",
    D: "+4",
    E: "+5",
    F: "+6",
    G: "+7",
    H: "+8",
    I: "+9",
    "}": "-0",
    J: "-1",
    K: "-2",
    L: "-3",
    M: "-4",
    N: "-5",
    O: "-6",
    P: "-7",
    Q: "-8",
    R: "-9",
};

var input = "00000016}";
var last_char = input.slice(-1);
if (last_char in map) {
    if (map[last_char].slice(0,1) == "-") {
        output = "-" + input.slice(0, -1) + map[last_char].slice(-1);
    } else {
        output = input.slice(0, -1) + map[last_char].slice(-1);
    }
    console.log(output);
}

It just checks id the last character is in the list and then appends it to the number.

Sign up to request clarification or add additional context in comments.

Comments

0

I would write a simple reg expression to match the string and then it is a simple check to see it it should be a + or -

var map = {
  '{': '+0',
  'A': '+1',
  'B': '+2',
  'C': '+3',
  'D': '+4',
  'E': '+5',
  'F': '+6',
  'G': '+7',
  'H': '+8',
  'I': '+9',
  '}': '-0',
  'J': '-1',
  'K': '-2',
  'L': '-3',
  'M': '-4',
  'N': '-5',
  'O': '-6',
  'P': '-7',
  'Q': '-8',
  'R': '-9'
};

function updateMyString(str) {
  return str.replace(/^(-?)(.+)(.)$/, function(_, sign, mid, char) {
    const repl = (map[char] || '+' + char).match(/([-+])(\d+)/);
    const updatedSign = (repl[1] === '+') ? sign : (sign === "-") ? '' : '-';
    return updatedSign + mid + repl[2];
  });
}

console.log("00000016B", updateMyString("00000016B"));
console.log("-00000016B", updateMyString("-00000016B"));
console.log("00000016K", updateMyString("00000016K"));
console.log("-00000016K", updateMyString("-00000016K"));

Comments

0

You can look it up by grabbing the last character and looking it up in the map.

const charMap = {
  '{': +0,  'A': +1,  'B': +2,  'C': +3,  'D': +4,  'E': +5,  'F': +6,
  'G': +7,  'H': +8,  'I': +9,  '}': -0,  'J': -1,  'K': -2,  'L': -3,
  'M': -4,  'N': -5,  'O': -6,  'P': -7,  'Q': -8,  'R': -9
}

const
  fix = (str) =>
    ((head, last) =>
      (found =>
        `${found < 0 ? '-' : ''}${head}${!isNaN(found) ? Math.abs(found) : last}`)
      (charMap[last]))
    (str.substring(0, str.length - 1), str.charAt(str.length - 1)),
  fixAll = (...vargs) => vargs.map(fix);

console.log(fix('00000016B')); //  000000162
console.log(fix('00000016K')); // -000000162
console.log(fix('00000016Z')); //  00000016Z (Unknown)

fixAll(
  '00000016{', //  000000160
  '00000016O', // -000000166
  '00000016R'  // -000000169
).forEach(res => console.log(res));
.as-onsole-wrapper { top: 0; max-height: 100% !important; }

Comments

0

you are overkilling the solution, basically you can do it by getting the value and then replace it, adding a clause to add or not the - signe.

just a function like this would do the job:

const replaceChar = (str) => {
  // get the char to replace
  const char = str.substr(8, 9);
  // get the value of the character to replace
  const mapValue = map[char];
  // get the signe and the value to use on the string
  const [signe, value] = mapValue.split("");
  // first replace the character for the new value
  const replaced = str.replace(char, value);
  // now lets check if we need the signe or not
  const start = signe === '+' ? '' : '-';

  return start + replaced;
}

here you can find a working example, I used a forEach to illustrate various examples.

var strings = [
  '00000016B',
  '00000016H',
  '00000016A',
  '00000016D',
  '00000016}',
  '00000016P',
  '00000016K',
]
var map = {
  '{': '+0',
  'A': '+1',
  'B': '+2',
  'C': '+3',
  'D': '+4',
  'E': '+5',
  'F': '+6',
  'G': '+7',
  'H': '+8',
  'I': '+9',
  '}': '-0',
  'J': '-1',
  'K': '-2',
  'L': '-3',
  'M': '-4',
  'N': '-5',
  'O': '-6',
  'P': '-7',
  'Q': '-8',
  'R': '-9'
};


const replaceChar = (str) => {
  // get the char to replace
  const char = str.substr(8, 9);
  // get the value of the character to replace
  const mapValue = map[char];
  // get the signe and the value to use on the string
  const [signe, value] = mapValue.split("");
  // first replace the character for the new value
  const replaced = str.replace(char, value);
  // now lets check if we need the signe or not
  const start = signe === '+' ? '' : '-';

  return start + replaced;
}


strings.forEach(str => {
  console.log(str, " --> ", replaceChar(str));
})

Comments

0

So, my approach is a bit different. First, do not change the standard replaceAll function. It's not a good practice. Then, let's consider your data like a object instead of an array. So something like this:

var map = {
    positive:['{','A','B','C','D','E','F','G','H','I'],
    negative:['}','J','K', 'L','M','N', 'O','P', 'Q','R']
}

Then you need a function that returns a converted string. In my idea, I thought about a function that tell us also if one of the char is present in our string. The function can be like this:

function convertFromArray(text,arr){
    let isPresent = false;
    arr.forEach((char,i)=>{
    if (text.includes(char)){
      text = text.replace(char, i);
      isPresent = true;
    }
  });
  return {isPresent,text};
}

Then we need a general convert function that does the conversion and add the minus symbol if it's needed:

function convert(text){
  let positiveResults = convertFromArray(text,map.positive);
  let negativeResults = convertFromArray(positiveResults.text,map.negative);
  return (negativeResults.isPresent)?'-'+negativeResults.text:positiveResults.text;
}

I created a playground for you: https://jsfiddle.net/youdede/q47pst3L/31/

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.