将字符串中的最后一个字符chop/slice/trim

JavaScript chop/slice/trim off last character in string

我有一根绳子,12345.00,我想把它还给12345.0

我看过trim,但它看起来只是在修剪空白和slice,我不知道这是如何工作的。有什么建议吗?

  • 你介意四舍五入吗?12345.46=12345.5还是12345.4?
  • 您知道后缀是什么,还是希望根据下划线拆分和删除最后一个单词?
  • 呵呵,呵呵,@rsolberg:你不能把线绕起来!
  • @齐吉说什么?Math.round('0.5') === 1)
  • @TwisterRob哦,javascript,我要用你做什么?*摇头*


可以使用子字符串函数:

1
2
var str ="12345.00";
str = str.substring(0, str.length - 1); //"12345.0"

这是公认的答案,但根据下面的对话,slice语法更清晰:

1
2
var str ="12345.00";
str = str.slice(0, -1); //"12345.0"

  • @切片符号对我来说更清晰。我以前使用的是子字符串版本。谢谢!
  • 如果我错了请原谅我,但您不需要再次将str.substring的值赋给str吗?如str = str.substring(0, str.length -1);
  • slicesubstring方法几乎相同;除了slice()接受相对于字符串结尾的负索引,而不是substring之外,它抛出out-of-bound错误。
  • 不适用于IE 8文档模式8。
  • 如果有人想知道,substringslice快11%。jspef.com/js-slice-vs-substring-test测试
  • 子字符串是疯狂的微优化,我认为你不应该这样做。首先最大化可读性。然后根据需要优化低挂水果。
  • @不再弯曲,在我的铬46,切片现在是0.24%更快!
  • 在大多数浏览器中,SUBSTR是实现这一点的最快方法。jspef.com/slice vs substr vs substring methods long string/‌&8203;2
  • 不起作用,我得到了logik.js:156 Uncaught TypeError: str.slice is not a function
  • @EdwardBlack因为你的str不是字符串。
  • str.slice(0, 1);也能用!
  • 生活就是虱子…或者类似的


你可以用切片!你只需要确保你知道如何使用它。正数相对于开始,负数相对于结束。

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

  • 与接受的解决方案相比,这更优雅,甚至可以与动态创建的字符串一起使用。
  • 性能也很相似。jspef.com/slice-vs-substring-trim-end(切片vs-substring-trim-end)
  • js>是怎么回事?这是来自命令行吗?
  • 我使用JSDB(jsdb.org)作为快速测试shell。强烈推荐。
  • 我喜欢这种方式,因为它与PHP结合使用,考虑了SUBSTR函数,更容易记忆和快速编写。
  • @Sameeralibhai我同意你的观点,但是substring方法不能也用于动态字符串吗?通过使用str.length动态获取长度?
  • 应该添加第一个索引是包含的,第二个是独占的。
  • @Kevinbeal你可以在主流浏览器中使用F12,在控制台中输入它,在任何页面上工作,甚至你有上下文,可以加载库。
  • 其他答案都不值得一看。


可以使用javascript字符串对象的子字符串方法:

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

它无条件地从字符串s中删除最后四个字符。

但是,如果要有条件地删除最后四个字符,仅当它们是_bar时:

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

  • 这里的slice更好。s.slice(0, -4)
  • 或者:s.slice(0,-"条形图".长度)(如果不想硬编码字符数,则很有用)
  • 我喜欢这个,因为他也帮我换了一个特定的结尾。


最简单的方法是使用字符串的slice方法,它允许负位置(对应于字符串末端的偏移量):

1
2
var s ="your string";
var withoutLastFourChars = s.slice(0, -4);

如果需要更一般的方法删除最后一个下划线(包括)之后的所有内容,可以执行以下操作(只要s保证至少包含一个下划线):

1
2
3
var s ="your_string";
var withoutLastChunk = s.slice(0, s.lastIndexOf("_"));
// withoutLastChunk =="your"


对于像您的例子这样的数字,我建议您在substring上执行此操作:

1
alert(parseFloat('12345.00').toFixed(1)); // 12345.0

请注意,这实际上是将数字取整的,我认为这是需要的,但可能不是:

1
alert(parseFloat('12345.46').toFixed(1)); // 12345.5

  • +1这是OP所需要的,忘记了存在要修剪的字符串的错误假设。
  • 这不是一个错误的假设,OP谈论的是字符串。你的假设是错误的,因为OP不谈论取整数字。


使用javascript的slice函数:

1
2
var string = 'foo_bar';
string = string.slice(0, -4); // Slice off last four characters here

这可以用来删除任何长度的字符串末尾的"_bar"。


正则表达式就是您要查找的:

1
2
var str ="foo_bar";
alert(str.replace(/_bar$/,""));

  • 你的解决方案是可行的,但亚历克斯的回答更全面。所以我接受他的。谢谢!
  • 这解决了一个相关的条件删除问题,而不是盲目截断问题。


怎么样:

1
2
var myString ="12345.00";
myString.substring(0, myString.length - 1);

试试这个:

1
2
var myString ="Hello World!";
myString.slice(0, -1);


1
2
3
4
5
"a string".match(/(.*).$/)[1] // => a strin

"a string".match(/(.*).$/) // returns ["a string","a strin"]

"a string".match(/(.*).{2}$/)[1] // to get two chars off => a stri
  • (.%),多次捕获任何字符
  • ,匹配最后一个字符,在本例中
  • $匹配字符串的结尾
    • 我喜欢这个,因为尽管有.splice(),您还是找到了使用正则表达式的方法。


    使用正则表达式:

    1
    2
    var aStr ="12345.00";
    aStr = aStr.replace(/.$/, '');

    1
    2
    3
    4
    5
    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

    这里有一个选择,我认为我没有看到其他答案,只是为了好玩。

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

    不像slice或substring那样清晰或简单,但允许您使用一些好的数组方法来处理字符串,因此值得了解。


    1
    2
    var str ="test!";
    var newStr = str.slice(0,-1); //test

    • 与所有其他答案相比,这又增加了什么?


    如果要对浮点数进行常规舍入,而不只是修剪最后一个字符:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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

    编辑:正如保罗指出的,似乎有一个内置的函数。那个解决方案显然比我的要干净得多。使用parsefloat和tofixed


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

    https://jsfiddle.net/invos/w3zeqv6v/

    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()


    如果要删除靠近字符串末尾的内容(对于大小可变的字符串),可以将slice()和substr()组合起来。

    我有一个带有标记的字符串,动态构建,用逗号分隔的锚标记列表。字符串类似于:

    1
    var str ="text 1,text 2,text 2.3,text abc,";

    为了删除最后一个逗号,我做了以下操作:

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

    @Jason S:

    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

    抱歉,我的笔迹,但帖子之前被贴上了"jquery"的标签。所以,不能在jquery中使用slice(),因为slice()是jquery方法,用于操作dom元素,而不是子字符串…换言之,答案@jon erickson提出了一个非常完美的解决方案。

    但是,您的方法将在简单的javascript中运行jquery函数。需要说的是,由于评论中最后一次讨论,jquery比他自己的父母最著名的ecmascript更经常更新JS的扩展。

    这里还存在两种方法:

    作为我们的:

    string.substring(from,to)as plus if'to'index nulled返回字符串的其余部分。所以:string.substring(from)阳性或阴性…

    另外一些提供子串范围和"长度"的-substr()-只能是正数:string.substr(start,length)

    还有一些维护人员建议,最后一个方法string.substr(start,length)对于msie不起作用或不起作用。

    • 什么意思?String.prototype.slice是一种本地方法
    • 只是你说的。javascript本机方法,也是用于dom操作的jquery slice()方法:jquery api:.slice()。当然,这可以看作JSarray.slice()的多态继承,但这是两种不同的方法,我认为需要区分开来。所以这只是一个近似的知识。
    • 我不认为我们在同一个页面上…
    • 为什么不?…我的答案真的没用?…slice是原型ArrayString的通用方法。查找:array:array泛型方法并与string:string泛型方法进行比较…但它是如此的相对诞生…在这一点上,一个slice干扰jquery:)问题btw标记了jquery
    • 如果在一个字符串变量上调用.slice,它将按照op的要求执行。不管它是"内部jquery",也不可能以任何方式"干扰",除非用jquery覆盖String.prototype,我确信这会阻止任何javascript代码的工作。你的回答只是说其他答案不好,你提供的论点是错误的。
    • 你决定和我讨论一下?那么你应该知道,你的神话更加前后矛盾。对。就这样。
    • 让我们在聊天中继续讨论
    • 我同意@naugtur这个答案是错误的,jquery不影响字符串的slice方法。
    • 我认为Naugtur提出的观点是,很有可能,你最终会得到一个由jquery对象包装的字符串(例如,如果你做一些花哨的.data操作,最后得到这个"字符串"),如果你在上面调用slice,它就不会做你想要的。也就是说,这不是一个真正有用的答案。


    试试这个:

    1
    2
    3
    4
    5
    6
    7
    8
    9
        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]);
            }
        }

    您还可以在http://jsfiddle.net/informativejavascript/f7wtn/87/上尝试实时工作示例。

    • 谢谢卡马尔。不过,我已根据自己的需要将上述答案标记为可接受。注意上面的绿色复选标记。不过,我确实检查了你的代码。:)现在,在我的情况下,我只知道常见的结束字符序列。最好从字符串的末尾开始检查。如果我有一个看起来像"foo-b-u条"的字符串,而我只想去掉最后一个"-u条",你的建议就会失败。谢谢!两年前问一个问题,今天仍然能得到答案,这是一个非常有趣的经历。:)


    使用子字符串将所有内容都放到u条的左侧。但是首先,你必须在字符串中得到条的instr:

    1
    str.substring(3, 7);

    3是起始点,7是长度。

    • 这只在"foo-bar"上有效,而不是在"foo-foo-bar"上,问题是关于一个长度为任意长度但末端已知的字符串。