问:
我有一个字符串 12345.00,我希望它返回 12345.0。
我看过 trim,但看起来它只是修剪空白和 slice,我看不出这是如何工作的。有什么建议么?
答1:
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
您可以使用 substring 函数:
让 str = “12345.00”; str = str.substring(0, str.length - 1);控制台.log(str);
这是公认的答案,但根据下面的对话,slice 语法更加清晰:
让 str = “12345.00”; str = str.slice(0, -1);控制台.log(str);
@Kheu - 切片符号对我来说更清晰。我以前使用的是子字符串版本。谢谢!
如果我错了,请原谅我,但您不需要再次将 str.substring 的值分配给 str 吗?喜欢str = str.substring(0, str.length -1);
slice & substring 方法都是一样的;除了 slice() 接受一个负索引,相对于字符串的结尾,而不是 substring,它会抛出 out-of-bound 错误
如果有人想知道,substring 比 slice 快 11%。 jsperf.com/js-slice-vs-substring-test
substring 是疯狂的微优化,我认为你不应该这样做。首先最大化可读性。如果需要,然后优化低悬的果实。
答2:
huntsbot.com – 高效赚钱,自由工作
您可以使用slice!你只需要确保你知道如何使用它。正数是相对于开头的,负数是相对于结尾的。
js>"12345.00".slice(0,-1)
12345.0
与公认的解决方案相比,这更加优雅,甚至可以与动态创建的字符串一起使用
我喜欢这种方式,因为它结合了 php 对 substr 函数的思考,更容易记忆和即时编写。
@SameerAlibhai 我同意你的观点,但是 substring 方法也不能用于动态字符串吗?通过使用 str.length 来动态获取长度?
应该补充一点,第一个索引是包含的,第二个是排除的。
这适用于删除最后一个字符,但要注意是否要删除可变数量的字符; .slice(0, -0) 将返回一个空字符串!
答3:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
您可以使用 JavaScript 字符串对象的 substring 方法:
s = s.substring(0, s.length - 4)
它无条件地从字符串 s 中删除最后四个字符。
但是,如果您想有条件地删除最后四个字符,只有当它们完全_bar时:
var re = /_bar$/;
s.replace(re, "");
slice 在这里更好。 s.slice(0, -4)
或者: s.slice(0, -"_bar".length) (如果不想硬编码字符数,则很有用)
我喜欢这个,因为他还提供了替换指定结尾的帮助。
如果字符串中有多个实例,第二个示例将仅删除“_bar”的第一个实例
答4:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
最简单的方法是使用字符串的 slice 方法,它允许负位置(对应于从字符串末尾的偏移量):
const s = "your string";
const withoutLastFourChars = s.slice(0, -4);
如果您需要更通用的东西来删除(包括)最后一个下划线之后的所有内容,您可以执行以下操作(只要保证 s 至少包含一个下划线):
常量 s = “你的字符串”; const withoutLastChunk = s.slice(0, s.lastIndexOf(“_”));控制台.log(没有LastChunk);
答5:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
对于像您的示例这样的数字,我建议在 substring 上执行此操作:
console.log(parseFloat(‘12345.00’).toFixed(1));
请注意,这实际上会将数字四舍五入,但我认为这是需要的,但可能不是:
console.log(parseFloat(‘12345.46’).toFixed(1));
+1这是OP所需要的,忘记有要修剪的字符串的错误假设。
这不是一个错误的假设,OP 谈论的是字符串。你的假设是错误的,因为 OP 没有谈论四舍五入的数字。
答6:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
使用 JavaScript 的切片函数:
让字符串 = ‘foo_bar’; string = string.slice(0, -4); // 在此处切掉最后四个字符 console.log(string);
这可用于删除任何长度的字符串末尾的“_bar”。
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
答7:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
请注意 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(/.KaTeX parse error: Undefined control sequence: \ud at position 15: /, "")); // "ẞ\̲u̲d̲83e" console.lo…/)[1]); // “ẞ\ud83e” const utf16Chars = string.split(“”); utf16Chars.pop(); console.log(utf16Chars.join(“”)); // “ẞ\ud83e”
此外,如旧答案中所建议的,RegExp 方法不匹配末尾的换行符:
const string = “你好,世界!\n”; console.log(string.replace(/.KaTeX parse error: Undefined control sequence: \n at position 18: … "").endsWith("\̲n̲")); // true co…/) === 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(/.KaTeX parse error: Undefined control sequence: \n at position 19: … "").endsWith("\̲n̲")); // false c…/s) === null); // false console.log(unicodeString.replace(/.
/
s
u
,
"
"
)
)
;
/
/
ẞ
c
o
n
s
o
l
e
.
l
o
g
(
u
n
i
c
o
d
e
S
t
r
i
n
g
.
m
a
t
c
h
(
/
(
.
∗
)
.
/su, "")); // ẞ console.log(unicodeString.match(/(.*).
/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 可以更轻松地匹配这些内容。
谢谢你的解释。确实,它拓宽了视野。
答8:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
正则表达式是您正在寻找的:
让 str = “foo_bar”; console.log(str.replace(/_bar$/, “”));
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
这解决了条件删除而不是盲目截断的相关问题
答9:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
尝试这个:
const myString = “你好世界!”; console.log(myString.slice(0, -1));
答10:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
使用正则表达式:
让 aStr = “12345.00”; aStr = aStr.replace(/.$/, ‘’);控制台.log(aStr);
除了不支持 Unicode 之外,这也不匹配换行符。
答11:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
表现
今天 2020.05.13 我在 MacOs High Sierra v10.13.6 上对 Chrome v81.0、Safari v13.1 和 Firefox v76.0 上的所选解决方案进行了测试。
结论
slice(0,-1)(D) 是短字符串和长字符串的快速或最快解决方案,建议作为快速跨浏览器解决方案
基于 substring © 和 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(/.KaTeX parse error: Expected 'EOF', got '}' at position 9: /, ''); }̲ 函数 B(str) { re…/)[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; iconsole.log(${f.name}: ${f( “12345.00”)}
); [A,B,C,D,E,F,G].map(f=>log(f));此代码段仅提供解决方案
以下是 Chrome 的短字符串示例结果
https://i.stack.imgur.com/JDigN.png
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。