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

时间:2009-06-04 20:31:54

标签: javascript trim slice chop

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

我看过trim,但看起来它只是修剪空白和slice我看不出这是怎么回事。有什么建议吗?

26 个答案:

答案 0 :(得分:2879)

您可以使用substring功能:

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

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

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

答案 1 :(得分:1228)

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

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

答案 2 :(得分:252)

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

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

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

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

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

答案 3 :(得分:154)

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

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

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

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

答案 4 :(得分:66)

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

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

请注意,这实际上会对数字进行舍入,但我认为这是理想的但可能不是:

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

答案 5 :(得分:27)

使用JavaScript切片功能:

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

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

答案 6 :(得分:15)

您正在寻找正则表达式:

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

答案 7 :(得分:9)

怎么样:

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

答案 8 :(得分:8)

试试这个:

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

答案 9 :(得分:7)

"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
  1. (。*),多次捕获任何字符
  2. 。,匹配最后一个字符,在本例中为
  3. $,匹配字符串的结尾

答案 10 :(得分:7)

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

以前的答案中没有一个是支持Unicode的。 在大多数现代JavaScript引擎中,字符串都编码为UTF-16,但是更高的Unicode代码点需要calculated property,因此,较早存在的字符串方法只能在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的代码利用了字符串的迭代器;请参阅surrogate pairsArray.from。 也可以使用... spread(例如代替string)。

另请参阅string[Symbol.iterator]

示例:

const string = "ẞ?";

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

s上使用uRegExp标志

How to split Unicode string to characters in JavaScript使.匹配换行符,dotAll or s flag启用某些与Unicode相关的功能。 请注意,在使用u标志时,您可以消除不必要的标识转义符,例如unicode or u flag,例如\[很好,因为它会在不带反斜杠的情况下启动字符类,但是\:则不是,因为它是一个带反斜杠或不带反斜杠的:,因此您需要删除反斜杠

示例:

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),these are invalid in a u regexVS16 (U+FE0F)?(U + 1F308)组成。 在这里,即使Array.from也会将其分为四个“字符”。 可以通过ZWJ (U+200D)进行匹配。

答案 11 :(得分:7)

使用正则表达式:

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

答案 12 :(得分: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

答案 13 :(得分:5)

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

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

不像切片或子串那样清晰或简单,但允许你使用一些不错的数组方法来使用字符串,所以值得了解。

答案 14 :(得分:4)

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

答案 15 :(得分:3)

如果你想对浮动进行泛型舍入,而不是仅仅修剪最后一个字符:

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

答案 16 :(得分:3)

性能

今天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最慢

enter image description here

详细信息

我对溶液ABCD,E({ext),F,G(我的)

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

解决方案在下面的代码段中显示

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浏览器的示例结果

enter image description here

答案 17 :(得分:1)

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

答案 18 :(得分:1)

答案 19 :(得分:1)

最短的方法:

str.slice(0, -1); 

答案 20 :(得分:0)

通过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()方法->仅适用于数组,并且更改现有数组(对此要格外小心),您需要先将字符串转换为数组,然后再转换为数组。 / p>

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

答案 21 :(得分:0)

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

遗憾的是,这不适用于字符串,但是我们可以使用arr.length = 2来分割字符串,然后在进行任何修改后使用split()来加入字符串。

join()

答案 22 :(得分:-1)

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

答案 23 :(得分:-3)

  

@Jason S:

     

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

     

JS&gt; “中12345.00” .slice(0,-1)   12345.0

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

但是,你的方法将在jQuery函数中运行,在简单的Javascript中。 需要说的是由于在评论中的最后讨论,jQuery更多的是JS的可再生扩展,而不是他自己的父母最知名的ECMAScript。

这里也有两种方法:

作为我们的:

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

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

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

答案 24 :(得分:-3)

试试这个:

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

答案 25 :(得分:-6)

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

str.substring(3, 7);

3是开始,7是长度。