JavaScript截断/切片/修剪掉字符串中的最后一个字符

2020/09/15 07:01 · javascript ·  · 0评论

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

我已经看过了trim,但是看起来它只是在修剪空白,slice而我看不出它是如何工作的。有什么建议?

您可以使用substring函数:

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

您可以使用slice您只需要确保您知道如何使用它即可。正号相对于开始,负号相对于结束。

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

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

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

它无条件删除string中的最后四个字符s

但是,如果要有条件地删除最后四个字符,则只有它们完全相同 _bar

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

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

对于像您的示例这样的数字,建议不要这样做substring

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

请注意,尽管这实际上将对数字进行四舍五入,我想这是理想的,但也许并非如此:

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

使用JavaScript的slice函数:

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

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

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

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

试试这个:

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

怎么样:

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

使用正则表达式:

let aStr = "12345.00";
aStr = aStr.replace(/.$/, '');
console.log(aStr);
  1. (。*),多次捕获任何字符
console.log("a string".match(/(.*).$/)[1]);
  1. 。,匹配最后一个字符,在这种情况下
console.log("a string".match(/(.*).$/));
  1. $,匹配字符串的结尾
console.log("a string".match(/(.*).{2}$/)[1]);
const str = "test!";
console.log(str.slice(0, -1));

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

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

虽然不像slice或substring那样清晰易懂,但确实允许您使用一些不错的数组方法来处理字符串,因此值得一读。

最短的方法:

str.slice(0, -1); 

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

先前的答案都不是支持Unicode的。在大多数现代JavaScript引擎中,字符串被编码为UTF-16,但是更高的Unicode代码点需要代理对,因此,较早的,已存在的字符串方法可在UTF-16代码单元上运行,而不是在Unicode代码点上运行。

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...传播
string[Symbol.iterator]也可以使用(例如代替string)。

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

例子:

const string = "ẞ🦊";

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

在上使用su标志RegExp

dotAlls标志品牌.相匹配换行符,则unicodeu标志启用某些Unicode相关功能。

例子:

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)组成。在这里,even Array.from会将其分为四个“字符”。可以使用Unicode属性转义序列属性提案进行匹配

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

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

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

性能

今天,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问题)-您可以在此处运行
  • 1M长字符串-您可以在此处运行

解决方案在下面的代码段中提供

这是短字符串的Chrome结果示例

在此处输入图片说明

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

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

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

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

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

如果要删除接近字符串末尾的内容(对于可变大小的字符串),可以组合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);

试试这个:

<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/上尝试该在线示例

@Jason S:

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

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

对不起,我的graphomany但帖子早些时候被标记为“ jquery”。因此,您不能 在jQuery中使用 slice(),因为slice()是用于DOM元素而不是子字符串的jQuery方法。换句话说,答案@Jon Erickson提出了真正完美的解决方案。

但是,您的方法将无法在简单的Javascript中使用jQuery函数。需要说的是,由于在评论中进行了最后的讨论,所以jQuery比其父辈最著名的ECMAScript更经常是JS的可更新扩展。

这里也存在两种方法:

作为我们的:

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

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

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

使用子字符串将所有内容移到_bar的左侧。但是首先您必须在字符串中获得_bar的指令:

str.substring(3, 7);

3是开始,7是长度。

本文地址:http://javascript.askforanswer.com/javascriptjieduan-qiepian-xiujiandiaozifuchuanzhongdezuihouyigezifu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!