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

Phi*_*ord 1840 javascript trim slice chop

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

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

Jon*_*son 3023

您可以使用子字符串函数:

let str = "12345.00";
str = str.substring(0, str.length - 1);
console.log(str);
Run Code Online (Sandbox Code Playgroud)

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

let str = "12345.00";
str = str.slice(0, -1); 
console.log(str);
Run Code Online (Sandbox Code Playgroud)

  • 如果我错了,请原谅我,但是你不需要再次将str.substring的值赋给str吗?像`str = str.substring(0,str.length -1);` (31认同)
  • @Kheu - 切片符号对我来说更清晰.我以前使用的是子串版本.谢谢! (19认同)
  • substring是疯狂的微优化,我认为你不应该这样做.最大限度地提高可读性.然后根据需要优化低挂水果. (16认同)
  • 如果有人想知道,`substring`比`slice`快11%.http://jsperf.com/js-slice-vs-substring-test (14认同)
  • `slice`和`substring`方法都是一样的; 除了`slice()`接受负索引,相对于字符串的结尾,而不是`substring`,它抛出`越界'错误 (10认同)
  • @BenR不再了,在我的Chrome 46中,切片现在快了0.24%! (4认同)
  • @EdwardBlack 因为你的 str 不是字符串。 (3认同)
  • 生活是虱子...之类的 (2认同)

Jas*_*n S 1253

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

js>"12345.00".slice(0,-1)
12345.0
Run Code Online (Sandbox Code Playgroud)

  • 与已接受的解决方案相比,这种方式更加优雅,即使使用动态创建的字符串也可以使用 (69认同)
  • 什么是`js>`?这是从命令行吗? (14认同)
  • 性能也类似.http://jsperf.com/slice-vs-substring-trim-end (9认同)
  • 我使用jsdb(http://www.jsdb.org)作为快速测试shell.强烈推荐. (7认同)
  • @SameerAlibhai 我同意你的看法,但是`substring` 方法不能也用于动态字符串吗?通过使用 str.length 动态获取长度? (2认同)
  • 这适用于删除最后一个字符,但如果您想删除可变数量的字符,请注意;`.slice(0, -0)` 将返回一个空字符串! (2认同)

Ale*_*lli 255

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

s = s.substring(0, s.length - 4)
Run Code Online (Sandbox Code Playgroud)

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

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

var re = /_bar$/;
s.replace(re, "");
Run Code Online (Sandbox Code Playgroud)

  • `slice`在这里更好.`s.slice(0,-4)` (107认同)
  • 或者:s.slice(0, - "_ bar".length)(如果不想对字符数进行硬编码,则非常有用) (12认同)
  • 我喜欢这个,因为他也帮助替换指定的结尾. (3认同)

Tim*_*own 157

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

const s = "your string";
const withoutLastFourChars = s.slice(0, -4);
Run Code Online (Sandbox Code Playgroud)

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

const s = "your_string";
const withoutLastChunk = s.slice(0, s.lastIndexOf("_"));
console.log(withoutLastChunk);
Run Code Online (Sandbox Code Playgroud)


Pao*_*ino 67

对于像你的例子这样的数字,我建议这样做substring:

console.log(parseFloat('12345.00').toFixed(1));
Run Code Online (Sandbox Code Playgroud)

请注意,这实际上将围绕数字,但我想象的是希望,但可能不是:

console.log(parseFloat('12345.46').toFixed(1));
Run Code Online (Sandbox Code Playgroud)

  • +1这就是OP所需要的,忘记了有裁剪字符串的错误假设. (11认同)
  • 这不是一个错误的假设,OP谈到字符串。您的假设是错误的,因为OP并未讨论舍入数字。 (2认同)

Aks*_*shi 29

使用JavaScript的切片功能:

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

这可用于删除任何长度的字符串末尾的"_bar".


w35*_*l3y 18

您正在寻找正则表达式:

let str = "foo_bar";
console.log(str.replace(/_bar$/, ""));
Run Code Online (Sandbox Code Playgroud)


小智 14

/sf/ask/2437228251/

\n
\n

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

\n
\n
"11.01 \xc2\xb0C".slice(0,-2).trim()\n
Run Code Online (Sandbox Code Playgroud)\n


Seb*_*mon 11

请注意,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"
Run Code Online (Sandbox Code Playgroud)

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

const string = "Hello, world!\n";

console.log(string.replace(/.$/, "").endsWith("\n")); // true
console.log(string.match(/(.*).$/) === null); // true
Run Code Online (Sandbox Code Playgroud)


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

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("")); // "?"
Run Code Online (Sandbox Code Playgroud)

在 a 上使用su标志RegExp

dotAlls标志品牌.相匹配换行符,则unicodeu标志启用某些Unicode相关功能。请注意,在使用u标志时,您可以消除不必要的身份转义,因为这些在uregex 中是无效的,例如\[很好,因为它会启动一个没有反斜杠的字符类,但\:不是,因为它是:有或没有反斜杠的,因此您需要删除反斜杠。

例子:

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
Run Code Online (Sandbox Code Playgroud)


请注意,某些字素由多个代码点??组成,例如,由(U+1F3F3)、VS16(U+FE0F)ZWJ(U+200D)(U+1F308) 序列组成。在这里,evenArray.from将其拆分为四个“字符”。使用RegExp 集合表示法和字符串提案的属性更容易匹配这些。


dar*_*iom 9

怎么样:

let myString = "12345.00";
console.log(myString.substring(0, myString.length - 1));
Run Code Online (Sandbox Code Playgroud)


Som*_*atd 9

试试这个:

const myString = "Hello World!";
console.log(myString.slice(0, -1));
Run Code Online (Sandbox Code Playgroud)


小智 9

使用正则表达式:

let aStr = "12345.00";
aStr = aStr.replace(/.$/, '');
console.log(aStr);
Run Code Online (Sandbox Code Playgroud)


jua*_*tas 7

console.log("a string".match(/(.*).$/)[1]);
Run Code Online (Sandbox Code Playgroud)
  1. (.*),多次捕获任何字符
  2. .,匹配最后一个字符,在这种情况下
  3. $,匹配字符串的结尾

  • 我喜欢这个,因为尽管.splice()你找到了一种使用正则表达式的方法. (9认同)
  • 除了不支持 Unicode 之外,它也不匹配换行符。 (2认同)

uof*_*ofc 7

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
Run Code Online (Sandbox Code Playgroud)


Ida*_*dan 6

最短的方法:

str.slice(0, -1); 
Run Code Online (Sandbox Code Playgroud)


Pat*_*and 5

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

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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

const str = "test!";
console.log(str.slice(0, -1));
Run Code Online (Sandbox Code Playgroud)

  • 与所有其他答案相比,这增加了什么? (2认同)

Mar*_*ers 5

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

var strArr = "hello i'm a string".split("");
strArr.pop();
document.write(strArr.join(""));
Run Code Online (Sandbox Code Playgroud)

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


Kam*_*ski 5

表现

今天 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 长的字符串 - 你可以在这里运行

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

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));
Run Code Online (Sandbox Code Playgroud)
This snippet only presents soutions
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明