如何使用JavaScript砍掉/切片/修剪字符串中的最后一个字符?

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

我已经查看了trim,但看起来它只是修剪空格和slice,我看不出这是如何工作的。任何建议?

2242826 次浏览

您可以使用子串函数:

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

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

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

不如:

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

对于像您的示例这样的数字,我建议在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));

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

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.0MoreMath.round(float2, 1) => 12345.5MoreMath.round(float3, 1) => 12346.0

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

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

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

@贾森:

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

js>"12345.00"。切片(0,-1)12345.0

对不起我的graph omany,但帖子之前被标记为“jQuery”。所以,jQuery中的你不能用切片是因为切片是用于DOM元素操作的jQuery方法,而不是子字符串…换句话说,答案@陈志立建议真正完美的解决方案。

但是,您的方法将在简单的Javascript中使用jQuery函数。需要说的是,由于评论中的最后一次讨论,jQuery比他自己的父母最著名的ECMAScript更经常地是JS的可再生扩展。

这里也有两种方法:

作为我们的:

string.substring(from,to)as加上if'to'index nulled返回字符串的其余部分。所以:string.substring(from)积极或消极…

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

此外,一些维护者建议最后一种方法string.substr(start,length)不起作用或对MSIE出错。

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

str.substring(3, 7);

3是起点,7是长度。

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

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

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

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

var re = /_bar$/;s.replace(re, "");
if(str.substring(str.length - 4) == "_bar"){str = str.substring(0, str.length - 4);}

正则表达式就是你要找的:

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

最简单的方法是使用字符串的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);

试试这个:

<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/上的实时工作示例。

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

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

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

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

3.$,匹配字符串的末尾:

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

试试这个:

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

使用JavaScript的切片函数:

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

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

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

使用regex:

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

如果您想删除接近字符串末尾的内容(在可变大小的字符串的情况下),您可以组合切片()和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);

这里有一个我认为我在其他答案中没有看到的替代方案,只是为了好玩。

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

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

性能

今天2020.05.13我在MacO High Sierra v10.13.6上Chromev81.0、Safariv13.1和Firefox v76.0上执行所选解决方案的测试。

结论

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

在此处输入图片描述

详情

我对解决方案一个BCD、E(分机)、F、G(我的)进行两个测试

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

解决方案在下面的片段中给出

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

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

前面的答案都不支持Unicode。在大多数现代JavaScript引擎中,字符串被编码为UTF-16,但更高的Unicode代码点需要代理对,因此旧的、预先存在的字符串方法在UTF-16代码单元上运行,而不是Unicode代码点。见:不要使用#0

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")); // trueconsole.log(string.match(/(.*).$/) === null); // true


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

Unicode感知代码使用字符串的迭代器;请参阅#0#1传播#0也可以使用(例如代替string)。

另见如何在JavaScript中将Unicode字符串拆分为字符

示例:

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

RegExp上使用su标志

#0或#1标志使.匹配换行符,#3或#4标志启用某些Unicode相关功能。请注意,当使用u标志时,您消除了不必要的身份转义,因为这些在#0正则表达式中无效,例如\[很好,因为它会启动一个没有反斜杠的字符类,但\:不是,因为它是:有或没有反斜杠,所以您需要删除反斜杠。

示例:

const unicodeString = "ẞ🦊",lineBreakString = "Hello, world!\n";
console.log(lineBreakString.replace(/.$/s, "").endsWith("\n")); // falseconsole.log(lineBreakString.match(/(.*).$/s) === null); // falseconsole.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)、#2(U+FE0F)#3(U+200D)🌈(U+1F308)组成。在这里,即使是Array.from也会将其拆分为四个“字符”。使用RegExp集合表示法和字符串属性提案更容易匹配这些。

事实上,您可以使用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))

通过切片(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 = /.$/glet b = str.replace(regExp,"")console.log(b, "<= b");console.log(str, "<= str is NOT changed");

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

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

尝试使用toFixed

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