我有一个字符串 12345.00
,我希望它返回 12345.0
。
我看过 trim
,但看起来它只是修剪空白和 slice
,我看不出这是如何工作的。有什么建议么?
您可以使用slice!你只需要确保你知道如何使用它。正数是相对于开头的,负数是相对于结尾的。
js>"12345.00".slice(0,-1)
12345.0
substring
方法也不能用于动态字符串吗?通过使用 str.length 来动态获取长度?
.slice(0, -0)
将返回一个空字符串!
您可以使用 JavaScript 字符串对象的 substring 方法:
s = s.substring(0, s.length - 4)
它无条件地从字符串 s
中删除最后四个字符。
但是,如果您想有条件地删除最后四个字符,只有当它们完全_bar
时:
var re = /_bar$/;
s.replace(re, "");
slice
在这里更好。 s.slice(0, -4)
最简单的方法是使用字符串的 slice
方法,它允许负位置(对应于从字符串末尾的偏移量):
const s = "your string";
const withoutLastFourChars = s.slice(0, -4);
如果您需要更通用的东西来删除(包括)最后一个下划线之后的所有内容,您可以执行以下操作(只要保证 s
至少包含一个下划线):
常量 s = "你的字符串"; const withoutLastChunk = s.slice(0, s.lastIndexOf("_"));控制台.log(没有LastChunk);
对于像您的示例这样的数字,我建议在 substring
上执行此操作:
console.log(parseFloat('12345.00').toFixed(1));
请注意,这实际上会将数字四舍五入,但我认为这是需要的,但可能不是:
console.log(parseFloat('12345.46').toFixed(1));
使用 JavaScript 的切片函数:
让字符串 = 'foo_bar'; string = string.slice(0, -4); // 在此处切掉最后四个字符 console.log(string);
这可用于删除任何长度的字符串末尾的“_bar”。
请注意 String.prototype.{ split, slice, substr, substring } 对 UTF-16 编码的字符串进行操作
之前的答案都不是 Unicode 感知的。在大多数现代 JavaScript 引擎中,字符串被编码为 UTF-16,但更高的 Unicode 代码点需要 surrogate pairs,因此旧的、预先存在的字符串方法在 UTF-16 代码单元上运行,而不是 Unicode 代码点。见:Do NOT use .split('')
。
常量字符串 = "ẞ🦊"; 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 = "你好,世界!\n"; console.log(string.replace(/.$/, "").endsWith("\n")); // true console.log(string.match(/(.*).$/) === null); // 真的
使用字符串迭代器来迭代字符
Unicode 感知代码利用字符串的迭代器;请参阅 Array.from
和 ...
spread。也可以使用 string[Symbol.iterator]
(例如,代替 string
)。
另见How to split Unicode string to characters in JavaScript。
例子:
常量字符串 = "ẞ🦊"; console.log(Array.from(string).slice(0, -1).join("")); // "ẞ" console.log([ ...string ].slice(0, -1).join("")); // "ẞ"
在 RegExp 上使用 s 和 u 标志
dotAll
or s
flag 使 .
匹配换行符,unicode
or u
flag 启用某些与 Unicode 相关的功能。请注意,当使用 u
标志时,您消除了不必要的身份转义,因为 these are invalid in a u
regex,例如 \[
很好,因为它会启动一个没有反斜杠的字符类,但 \:
不是,因为它是带或不带反斜杠的 :
,因此您需要删除反斜杠。
例子:
const unicodeString = "ẞ🦊", lineBreakString = "你好,世界!\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]); // ẞ // 现在 `split` 可以识别 Unicode: const unicodeCharacterArray = unicodeString.split(/(?:)/su), lineBreakCharacterArray = lineBreakString.split(/(?:)/su); unicodeCharacterArray.pop(); lineBreakCharacterArray.pop(); console.log(unicodeCharacterArray.join("")); // "ẞ" console.log(lineBreakCharacterArray.join("").endsWith("\n")); // 错误的
请注意,某些字素包含多个代码点,例如 🏳️🌈
由序列 🏳
(U+1F3F3)、VS16
(U+FE0F)、ZWJ
(U+200D)、🌈
(U+1F308) 组成。在这里,即使是 Array.from
也会将其拆分为四个“字符”。使用 RegExp set notation and properties of strings proposal 可以更轻松地匹配这些内容。
正则表达式是您正在寻找的:
让 str = "foo_bar"; console.log(str.replace(/_bar$/, ""));
尝试这个:
const myString = "你好世界!"; console.log(myString.slice(0, -1));
使用正则表达式:
让 aStr = "12345.00"; aStr = aStr.replace(/.$/, '');控制台.log(aStr);
表现
今天 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 对于长字符串最慢
https://i.stack.imgur.com/YfBgV.png
细节
我对解决方案 A、B、C、D、E(ext)、F、G(my) 执行两个测试
对于 8-char 短字符串(来自 OP 问题) - 你可以在这里运行它
对于 1M 长的字符串 - 你可以在这里运行它
解决方案显示在下面的代码片段中
函数 A(str) { return str.replace(/.$/, ''); } 函数 B(str) { return str.match(/(.*).$/)[1]; } function C(str) { return str.substring(0, str.length - 1); } 函数 D(str) { 返回 str.slice(0, -1); } function E(str) { return str.substr(0, str.length - 1); } 函数 F(str) { 让 s= str.split(""); s.pop();返回 s.join(""); } 函数 G(str) { 让 s=''; for(让 i=0; i
以下是 Chrome 的短字符串示例结果
https://i.stack.imgur.com/JDigN.png
怎么样:
让 myString = "12345.00"; console.log(myString.substring(0, myString.length - 1));
1. (.*)
,多次捕获任意字符:
console.log("一个字符串".match(/(.*).$/)[1]);
2. .
,匹配最后一个字符,在这种情况下:
console.log("一个字符串".match(/(.*).$/));
3. $
,匹配字符串的结尾:
console.log("一个字符串".match(/(.*).{2}$/)[1]);
这是我认为我在其他答案中没有看到的另一种选择,只是为了好玩。
var strArr = "你好,我是一个字符串".split(""); strArr.pop(); document.write(strArr.join(""));
不像切片或子字符串那样清晰或简单,但确实允许您使用一些不错的数组方法来处理字符串,因此值得了解。
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
如果您不想要空格,只需使用修剪
"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(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");
如果您想删除接近字符串末尾的内容(如果是可变大小的字符串),您可以结合使用 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);
尝试使用 toFixed
const str = "12345.00";
return (+str).toFixed(1);
尝试这个:
<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
对不起我的笔迹,但帖子之前被标记为“jquery”。因此,您不能在 jQuery 中使用 slice(),因为 slice() 是用于操作 DOM 元素而不是子字符串的 jQuery 方法......换句话说,回答 @Jon Erickson 建议非常完美的解决方案。
但是,您的方法将在简单的 Javascript 中使用 jQuery 函数。由于评论中的最后讨论,需要说 jQuery 比他自己的父母最知名的 ECMAScript 更经常是 JS 的可更新扩展。
这里也存在两种方法:
作为我们的:
string.substring(from,to)
如果 'to' 索引为空,则返回字符串的其余部分。所以: string.substring(from)
正面或负面...
和其他一些 - substr() - 提供子字符串的范围和“长度”只能是正数: string.substr(start,length)
此外,一些维护人员建议最后一种方法 string.substr(start,length)
对 MSIE 不起作用或出现错误。
String.prototype.slice
是本机方法
slice()
方法:jQuery API: .slice()。当然,这可以看作是 JS Array.slice() 的多态继承,但它是两种不同的方法,我认为需要将其区分开来。所以这只是对这些知识的近似。
.slice
,它将执行 OP 想要的操作。它是否在“jQuery 内部”并不重要,除非您用 jQuery 覆盖 String.prototype
,否则它不可能以任何方式“干扰”,我相信这会阻止任何 javascript 代码工作。您的回答只是说其他答案不好,并且您提供的论点不正确。
.data
操作并最终得到这个“字符串”),如果你调用slice
就可以了,不会为所欲为。也就是说,这并不是一个真正有用的答案。
使用 substring 获取 _bar 左侧的所有内容。但首先你必须在字符串中获取 _bar 的 instr:
str.substring(3, 7);
3是开始,7是长度。
str = str.substring(0, str.length -1);
slice
&substring
方法都是一样的;除了slice()
接受一个负索引,相对于字符串的结尾,而不是substring
,它会抛出out-of-bound
错误substring
比slice
快 11%。 jsperf.com/js-slice-vs-substring-test