【问题标题】:How do I chop/slice/trim off last character in string using Javascript?如何使用 Javascript 截断/切片/修剪字符串中的最后一个字符?
【发布时间】:2010-10-31 11:25:20
【问题描述】:

我有一个字符串12345.00,我希望它返回12345.0

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

【问题讨论】:

  • 你关心四舍五入吗? 12345.46 = 12345.5 还是 12345.4?
  • 你知道后缀是什么,还是你想根据你的下划线拆分和删除最后一个单词?

标签: javascript slice trim


【解决方案1】:

你可以使用substring函数:

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

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

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

【讨论】:

  • @Kheu - 切片符号对我来说更清晰。我以前使用的是子字符串版本。谢谢!
  • 如果我错了,请原谅我,但您不需要再次将 str.substring 的值分配给 str 吗?喜欢str = str.substring(0, str.length -1);
  • slice & substring 方法都差不多;除了slice() 接受一个负索引,相对于字符串的结尾,而不是substring,它会抛出out-of-bound 错误
  • 如果有人想知道,substringslice 快 11%。 jsperf.com/js-slice-vs-substring-test
  • substring 是疯狂的微优化,我认为您不应该这样做。首先最大化可读性。然后根据需要优化容易实现的目标。
【解决方案2】:

怎么样:

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

【讨论】:

    【解决方案3】:

    对于像您的示例这样的数字,我建议通过 substring 执行此操作:

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

    请注意,这实际上会将数字四舍五入,我认为这是需要的,但可能不是:

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

    【讨论】:

    • +1 这是 OP 所需要的,忘记有要修剪的字符串的错误假设。
    • 这不是一个错误的假设,OP 谈论的是字符串。你的假设是错误的,因为 OP 没有谈论四舍五入的数字。
    【解决方案4】:

    如果你想对浮点数进行通用舍入,而不是仅仅修剪最后一个字符:

    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
    

    编辑: 正如 Paolo 指出的那样,似乎存在一个内置函数。该解决方案显然比我的要干净得多。使用parseFloat 后跟toFixed

    【讨论】:

      【解决方案5】:

      您可以使用slice!你只需要确保你知道如何使用它。正数是相对于开头,负数是相对于结尾。

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

      【讨论】:

      • 与公认的解决方案相比,这更加优雅,甚至可以用于动态创建的字符串
      • 我喜欢这种方式,因为它结合了 php 对 substr 函数的思考,更容易记忆和即时编写。
      • @SameerAlibhai 我同意你的观点,但是 substring 方法不能也用于动态字符串吗?通过使用str.length来动态获取长度?
      • 应该加上第一个索引包含,第二个不包含。
      • 这适用于删除最后一个字符,但如果要删除可变数量的字符,请注意; .slice(0, -0) 将返回一个空字符串!
      【解决方案6】:

      @Jason S:

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

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

      对不起,我的笔迹,但帖子之前被标记为“jquery”。所以,你不能在 jQuery 中使用 slice() 因为 slice() 是 jQuery 的操作方法DOM 元素,而不是子字符串... 换句话说,回答 @Jon Erickson 提出了非常完美的解决方案。

      但是,您的方法将在简单的 Javascript 中使用 jQuery 函数。 需要说明的是,由于 cmets 中的最后讨论,jQuery 比他自己的父级最著名的 ECMAScript 更经常是 JS 的可更新扩展。

      这里也有两种方法:

      作为我们的:

      string.substring(from,to) 如果 'to' 索引为空,则返回字符串的其余部分。所以: string.substring(from) 正面或负面...

      和其他一些 - substr() - 提供子字符串的范围和“长度”只能是正数: string.substr(start,length)

      还有一些维护者建议最后一个方法string.substr(start,length) 对 MSIE 不起作用或出现错误。

      【讨论】:

      • 什么意思? String.prototype.slice 是本机方法
      • 只有你说的。 Javascript 原生方法,还有用于 DOM 操作的 jQuery slice() 方法:jQuery API: .slice()。当然,这可以看作是 JS Array.slice() 的多态继承,但它是两种不同的方法,我认为需要将其区分开来。所以这只是对这些知识的近似。
      • 如果你在一个字符串变量上调用.slice,它会做OP想要的。它是否在“jQuery 内部”并不重要,除非你用 jQuery 覆盖 String.prototype,否则它不可能以任何方式“干扰”,我确信这会阻止任何 javascript 代码工作。您的回答只是说其他答案不好,并且您提供的论点不正确。
      • 我同意@naugtur 这个答案是错误的,字符串的切片方法不受jQuery的影响。
      • 我认为 naugtur 提出的观点是,你可能最终得到一个由 jQuery 对象包裹的字符串(例如,如果你做了一些花哨的.data 操作并最终得到这个“ string"),如果你在上面调用slice,它不会做你想做的事。也就是说,这并不是一个真正有用的答案。
      【解决方案7】:

      使用 substring 获取 _bar 左侧的所有内容。但首先你必须在字符串中获取 _bar 的 instr:

      str.substring(3, 7);
      

      3 是起点,7 是长度。

      【讨论】:

      • 这仅适用于“foo_bar”而不适用于“foo_foo_bar”,问题是关于具有任何长度但已知结尾的字符串。
      【解决方案8】:

      您可以使用 JavaScript 字符串对象的substring 方法:

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

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

      但是,如果您想有条件地删除最后四个字符,前提是它们完全 _bar:

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

      【讨论】:

      • slice 在这里更好。 s.slice(0, -4)
      • 或者:s.slice(0, -"_bar".length) (如果不想硬编码字符数时很有用)
      • 我喜欢这个,因为他还提供了替换指定结尾的帮助。
      • 如果字符串中有多个实例,第二个示例只会删除“_bar”的第一个实例
      【解决方案9】:
      if(str.substring(str.length - 4) == "_bar")
      {
          str = str.substring(0, str.length - 4);
      }
      

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

        • 这解决了条件删除而不是盲目截断的相关问题
        【解决方案11】:

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

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

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

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

        【讨论】:

          【解决方案12】:

          试试这个:

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

          您也可以在http://jsfiddle.net/informativejavascript/F7WTn/87/ 上试用实时工作示例。

          【讨论】:

          • 谢谢卡马尔。但是,我已将上面的答案标记为可以满足我的需要。注意上面的绿色复选标记。不过,我确实检查了您的代码。 :) 现在,在我的情况下,我只知道常见的结束字符序列。最好从字符串的末尾开始检查。如果我有一个看起来像“foo_b_bar”的字符串,你的建议将失败,我只想取出最后一个“_bar”。不过谢谢!在 2 年前提出一个问题,今天仍然收到答案,这是一次非常有趣的经历。 :)
          【解决方案13】:

          1. (.*),多次捕获任意字符:

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

          2. .,匹配最后一个字符,在这种情况下:

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

          3. $,匹配字符串结尾:

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

          【讨论】:

          • 我喜欢这个,因为尽管 .splice() 你找到了一种使用正则表达式的方法。
          • 除了不支持 Unicode 之外,这也不匹配换行符。
          【解决方案14】:

          试试这个:

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

          【讨论】:

            【解决方案15】:

            使用 JavaScript 的切片函数:

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

            这可用于删除任何长度的字符串末尾的“_bar”。

            【讨论】:

              【解决方案16】:
              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
              

              【讨论】:

                【解决方案17】:

                使用正则表达式:

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

                【讨论】:

                • 除了不支持 Unicode 之外,这也不匹配换行符。
                【解决方案18】:

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

                如果您不想要空格,只需使用修剪

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

                【讨论】:

                  【解决方案19】:

                  如果您想删除接近字符串末尾的内容(如果是可变大小的字符串),您可以结合使用 slice() 和 substr()。

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

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

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

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

                  【讨论】:

                    【解决方案20】:

                    这是我认为我在其他答案中没有看到的另一种选择,只是为了好玩。

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

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

                    【讨论】:

                      【解决方案21】:

                      性能

                      今天 2020.05.13 我在 MacOs High Sierra v10.13.6 上的 Chrome v81.0、Safari v13.1 和 Firefox v76.0 上执行所选解决方案的测试。

                      结论

                      • slice(0,-1)(D) 是针对短字符串和长字符串的快速或最快解决方案,推荐作为快速跨浏览器解决方案
                      • 基于substring (C) 和substr(E) 的解决方案速度很快
                      • 基于正则表达式 (A,B) 的解决方案速度慢/中快
                      • 解决方案 B、F 和 G 对于长字符串来说很慢
                      • 解决方案 F 对于短字符串最慢,G 对于长字符串最慢

                      详情

                      我对解决方案ABCD、E(ext)、F、G(my) 执行两个测试

                      • 对于 8 字符短字符串(来自 OP 问题) - 您可以运行它HERE
                      • 对于 1M 长的字符串 - 你可以运行它HERE

                      解决方案在下面的sn-p中给出

                      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

                      以下是 Chrome 的短字符串示例结果

                      【讨论】:

                        【解决方案22】:

                        注意String.prototype.{ split, slice, substr, substring } 对 UTF-16 编码的字符串进行操作

                        之前的答案都不是 Unicode 感知的。 在大多数现代 JavaScript 引擎中,字符串被编码为 UTF-16,但更高的 Unicode 代码点需要surrogate pairs,因此旧的、预先存在的字符串方法在 UTF-16 代码单元上运行,而不是 Unicode 代码点。 见: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"

                        此外,RegExp 方法,如旧答案中所建议的,不匹配末尾的换行符:

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

                        使用字符串迭代器来迭代字符

                        Unicode 感知代码利用字符串的迭代器;见Array.from... spread。 也可以使用string[Symbol.iterator](例如,代替string)。

                        另见How to split Unicode string to characters in JavaScript

                        例子:

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

                        RegExp 上使用su 标志

                        dotAll or s flag 使. 匹配换行符,unicode or u flag 启用某些与 Unicode 相关的功能。 请注意,当使用 u 标志时,您可以消除不必要的身份转义,例如 these are invalid in a u regex,例如\[ 很好,因为它会启动一个不带反斜杠的字符类,但 \: 不是,因为它是带有或不带反斜杠的 :,因此您需要删除反斜杠。

                        例子:

                        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

                        请注意,有些字素包含多个代码点,例如?️‍? 由序列? (U+1F3F3)、VS16 (U+FE0F)ZWJ (U+200D)? (U+1F308) 组成。 在这里,即使Array.from 也会将其拆分为四个“字符”。 使用RegExp set notation and properties of strings proposal 可以更轻松地匹配这些内容。

                        【讨论】:

                          【解决方案23】:

                          实际上,您可以使用 arr.length = 2 删除数组的最后一个 arr.length - 2 项,如果数组长度为 5,则会删除最后 3 个项。

                          遗憾的是,这不适用于字符串,但我们可以使用split() 拆分字符串,然后在我们进行任何修改后使用join() 加入字符串。

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

                          【讨论】:

                            【解决方案24】:

                            通过 slice(indexStart, indexEnd) 方法 - 注意,这不会更改现有字符串,它会创建一个副本并更改副本。

                            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");
                            

                            通过正则表达式方法 - 注意,这不会更改现有字符串,它会创建一个副本并更改副本。

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

                            通过 array.splice() 方法 -> 这仅适用于数组,它会更改现有数组(对这个数组非常小心),您需要先将字符串转换为数组,然后再返回。

                            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");
                            

                            【讨论】:

                              【解决方案25】:

                              尝试使用toFixed

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

                              【讨论】:

                                猜你喜欢
                                • 2023-01-28
                                • 2019-07-30
                                • 1970-01-01
                                • 2011-04-04
                                • 1970-01-01
                                • 2014-07-14
                                • 1970-01-01
                                相关资源
                                最近更新 更多