'How do I chop/slice/trim off last character in string using Javascript?

I have a string, 12345.00, and I would like it to return 12345.0.

I have looked at trim, but it looks like it is only trimming whitespace and slice which I don't see how this would work. Any suggestions?



Solution 1:[1]

You can use the substring function:

let str = "12345.00";
str = str.substring(0, str.length - 1);
console.log(str);

This is the accepted answer, but as per the conversations below, the slice syntax is much clearer:

let str = "12345.00";
str = str.slice(0, -1); 
console.log(str);

Solution 2:[2]

You can use slice! You just have to make sure you know how to use it. Positive #s are relative to the beginning, negative numbers are relative to the end.

js>"12345.00".slice(0,-1)
12345.0

Solution 3:[3]

You can use the substring method of JavaScript string objects:

s = s.substring(0, s.length - 4)

It unconditionally removes the last four characters from string s.

However, if you want to conditionally remove the last four characters, only if they are exactly _bar:

var re = /_bar$/;
s.replace(re, "");

Solution 4:[4]

The easiest method is to use the slice method of the string, which allows negative positions (corresponding to offsets from the end of the string):

const s = "your string";
const withoutLastFourChars = s.slice(0, -4);

If you needed something more general to remove everything after (and including) the last underscore, you could do the following (so long as s is guaranteed to contain at least one underscore):

const s = "your_string";
const withoutLastChunk = s.slice(0, s.lastIndexOf("_"));
console.log(withoutLastChunk);

Solution 5:[5]

For a number like your example, I would recommend doing this over substring:

console.log(parseFloat('12345.00').toFixed(1));

Do note that this will actually round the number, though, which I would imagine is desired but maybe not:

console.log(parseFloat('12345.46').toFixed(1));

Solution 6:[6]

Using JavaScript's slice function:

let string = 'foo_bar';
string = string.slice(0, -4); // Slice off last four characters here
console.log(string);

This could be used to remove '_bar' at end of a string, of any length.

Solution 7:[7]

Be aware that String.prototype.{ split, slice, substr, substring } operate on UTF-16 encoded strings

None of the previous answers are Unicode-aware. Strings are encoded as UTF-16 in most modern JavaScript engines, but higher Unicode code points require surrogate pairs, so older, pre-existing string methods operate on UTF-16 code units, not Unicode code points. See: Do NOT use .split('').

const string = "??";

console.log(string.slice(0, -1)); // "?\ud83e"
console.log(string.substr(0, string.length - 1)); // "?\ud83e"
console.log(string.substring(0, string.length - 1)); // "?\ud83e"
console.log(string.replace(/.$/, "")); // "?\ud83e"
console.log(string.match(/(.*).$/)[1]); // "?\ud83e"

const utf16Chars = string.split("");

utf16Chars.pop();
console.log(utf16Chars.join("")); // "?\ud83e"

In addition, RegExp methods, as suggested in older answers, don’t match line breaks at the end:

const string = "Hello, world!\n";

console.log(string.replace(/.$/, "").endsWith("\n")); // true
console.log(string.match(/(.*).$/) === null); // true

Use the string iterator to iterate characters

Unicode-aware code utilizes the string’s iterator; see Array.from and ... spread. string[Symbol.iterator] can be used (e.g. instead of string) as well.

Also see How to split Unicode string to characters in JavaScript.

Examples:

const string = "??";

console.log(Array.from(string).slice(0, -1).join("")); // "?"
console.log([
  ...string
].slice(0, -1).join("")); // "?"

Use the s and u flags on a RegExp

The dotAll or s flag makes . match line break characters, the unicode or u flag enables certain Unicode-related features. Note that, when using the u flag, you eliminate unnecessary identity escapes, as these are invalid in a u regex, e.g. \[ is fine, as it would start a character class without the backslash, but \: isn’t, as it’s a : with or without the backslash, so you need to remove the backslash.

Examples:

const unicodeString = "??",
  lineBreakString = "Hello, world!\n";

console.log(lineBreakString.replace(/.$/s, "").endsWith("\n")); // false
console.log(lineBreakString.match(/(.*).$/s) === null); // false
console.log(unicodeString.replace(/.$/su, "")); // ?
console.log(unicodeString.match(/(.*).$/su)[1]); // ?

// Now `split` can be made Unicode-aware:

const unicodeCharacterArray = unicodeString.split(/(?:)/su),
  lineBreakCharacterArray = lineBreakString.split(/(?:)/su);

unicodeCharacterArray.pop();
lineBreakCharacterArray.pop();
console.log(unicodeCharacterArray.join("")); // "?"
console.log(lineBreakCharacterArray.join("").endsWith("\n")); // false

Note that some graphemes consist of more than one code point, e.g. ???? which consists of the sequence ? (U+1F3F3), VS16 (U+FE0F), ZWJ (U+200D), ? (U+1F308). Here, even Array.from will split this into four “characters”. Matching those is made easier with the RegExp set notation and properties of strings proposal.

Solution 8:[8]

A regular expression is what you are looking for:

let str = "foo_bar";
console.log(str.replace(/_bar$/, ""));

Solution 9:[9]

Try this:

const myString = "Hello World!";
console.log(myString.slice(0, -1));

Solution 10:[10]

Performance

Today 2020.05.13 I perform tests of chosen solutions on Chrome v81.0, Safari v13.1 and Firefox v76.0 on MacOs High Sierra v10.13.6.

Conclusions

  • the slice(0,-1)(D) is fast or fastest solution for short and long strings and it is recommended as fast cross-browser solution
  • solutions based on substring (C) and substr(E) are fast
  • solutions based on regular expressions (A,B) are slow/medium fast
  • solutions B, F and G are slow for long strings
  • solution F is slowest for short strings, G is slowest for long strings

enter image description here

Details

I perform two tests for solutions A, B, C, D, E(ext), F, G(my)

  • for 8-char short string (from OP question) - you can run it HERE
  • for 1M long string - you can run it HERE

Solutions are presented in below snippet

function A(str) {
  return str.replace(/.$/, '');
}

function B(str) {
  return str.match(/(.*).$/)[1];
}

function C(str) {
  return str.substring(0, str.length - 1);
}

function D(str) {
  return str.slice(0, -1); 
}

function E(str) {
  return str.substr(0, str.length - 1);
}

function F(str) {
  let s= str.split("");
  s.pop();
  return s.join("");
}

function G(str) {
  let s='';
  for(let i=0; i<str.length-1; i++) s+=str[i];
  return s;
 }



// ---------
// TEST
// ---------

let log = (f)=>console.log(`${f.name}: ${f("12345.00")}`);

[A,B,C,D,E,F,G].map(f=>log(f));
This snippet only presents soutions

Here are example results for Chrome for short string

enter image description here

Solution 11:[11]

Use regex:

let aStr = "12345.00";
aStr = aStr.replace(/.$/, '');
console.log(aStr);

Solution 12:[12]

How about:

let myString = "12345.00";
console.log(myString.substring(0, myString.length - 1));

Solution 13:[13]

1. (.*), captures any character multiple times:

console.log("a string".match(/(.*).$/)[1]);

2. ., matches last character, in this case:

console.log("a string".match(/(.*).$/));

3. $, matches the end of the string:

console.log("a string".match(/(.*).{2}$/)[1]);

Solution 14:[14]

Here is an alternative that i don't think i've seen in the other answers, just for fun.

var strArr = "hello i'm a string".split("");
strArr.pop();
document.write(strArr.join(""));

Not as legible or simple as slice or substring but does allow you to play with the string using some nice array methods, so worth knowing.

Solution 15:[15]

debris = string.split("_") //explode string into array of strings indexed by "_"

debris.pop(); //pop last element off the array (which you didn't want)

result = debris.join("_"); //fuse the remainng items together like the sun

Solution 16:[16]

https://stackoverflow.com/questions/34817546/javascript-how-to-delete-last-two-characters-in-a-string

Just use trim if you don't want spaces

"11.01 °C".slice(0,-2).trim()

Solution 17:[17]

If you want to do generic rounding of floats, instead of just trimming the last character:

var float1 = 12345.00,
    float2 = 12345.4567,
    float3 = 12345.982;

var MoreMath = {
    /**
     * Rounds a value to the specified number of decimals
     * @param float value The value to be rounded
     * @param int nrDecimals The number of decimals to round value to
     * @return float value rounded to nrDecimals decimals
     */
    round: function (value, nrDecimals) {
        var x = nrDecimals > 0 ? 10 * parseInt(nrDecimals, 10) : 1;
        return Math.round(value * x) / x;
    }
}

MoreMath.round(float1, 1) => 12345.0
MoreMath.round(float2, 1) => 12345.5
MoreMath.round(float3, 1) => 12346.0

EDIT: Seems like there exists a built in function for this, as Paolo points out. That solution is obviously much cleaner than mine. Use parseFloat followed by toFixed

Solution 18:[18]

if(str.substring(str.length - 4) == "_bar")
{
    str = str.substring(0, str.length - 4);
}

Solution 19:[19]

You can, in fact, remove the last arr.length - 2 items of an array using arr.length = 2, which if the array length was 5, would remove the last 3 items.

Sadly, this does not work for strings, but we can use split() to split the string, and then join() to join the string after we've made any modifications.

var str = 'string'

String.prototype.removeLast = function(n) {
  var string = this.split('')
  string.length = string.length - n

  return string.join('')
}

console.log(str.removeLast(3))

Solution 20:[20]

Via slice(indexStart, indexEnd) method - note, this does NOT CHANGE the existing string, it creates a copy and changes the copy.

console.clear();
let str = "12345.00";
let a = str.slice(0, str.length -1)
console.log(a, "<= a");
console.log(str, "<= str is NOT changed");

Via Regular Expression method - note, this does NOT CHANGE the existing string, it creates a copy and changes the copy.

console.clear();
let regExp = /.$/g
let b = str.replace(regExp,"")
console.log(b, "<= b");
console.log(str, "<= str is NOT changed");

Via array.splice() method -> this only works on arrays, and it CHANGES, the existing array (so careful with this one), you'll need to convert a string to an array first, then back.

console.clear();
let str = "12345.00";
let strToArray = str.split("")
console.log(strToArray, "<= strToArray");
let spliceMethod = strToArray.splice(str.length-1, 1)
str = strToArray.join("")
console.log(str, "<= str is changed now");

Solution 21:[21]

In cases where you want to remove something that is close to the end of a string (in case of variable sized strings) you can combine slice() and substr().

I had a string with markup, dynamically built, with a list of anchor tags separated by comma. The string was something like:

var str = "<a>text 1,</a><a>text 2,</a><a>text 2.3,</a><a>text abc,</a>";

To remove the last comma I did the following:

str = str.slice(0, -5) + str.substr(-4);

Solution 22:[22]

Try to use toFixed

const str = "12345.00";
return (+str).toFixed(1);

Solution 23:[23]

Try this:

<script>
    var x="foo_foo_foo_bar";
    for (var i=0; i<=x.length; i++) {
        if (x[i]=="_" && x[i+1]=="b") {
            break;
        }
        else {
            document.write(x[i]);
        }
    }
</script>

You can also try the live working example on http://jsfiddle.net/informativejavascript/F7WTn/87/.