JavaScriptが文字列の最後の文字を切り取る/スライスする/切り取る


1974

文字列を持っています。12345.00返して欲しいの12345.0ですが。

私は見ましたがtrim、それは空白を削除sliceするだけで、これがどのように機能するのかわかりません。助言がありますか?


36
丸めを気にしますか?12345.46 = 12345.5または12345.4?
RSolberg 2009年

9
接尾辞が何か知っていますか、またはアンダースコアに基づいて最後の単語を分割して削除しますか?
Cᴏʀʏ

65
ホーホーホー、@RSolberg:あなたがすることはできません丸い文字列が!
Ziggy 2013年

50
@ジギーは何と言いますか?Math.round('0.5') === 1;)
TWiStErRob 2015

16
@TWiStErRobああJavaScript、私はあなたと何をするつもりですか?*首を振る*
Chuck Le Butt

回答:


3214

サブストリング関数を使用できます。

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


23
@Kheu-スライス表記は私にはずっときれいです。以前はサブストリングバージョンを使用していました。ありがとう!
マットボール

32
私が間違っていても許してください。str.substringの値をstrに再度割り当てる必要はありませんか?いいねstr = str.substring(0, str.length -1);
ダグモリヌー

10
slicesubstringの方法は、すべてのほとんど同じです。を除いて、slice()は文字列の終わりを基準にして負のインデックスを受け入れますが、を受け入れませんsubstring。それはout-of-boundエラーをスローします
Amol M Kulkarni

20
誰かが疑問に思っている場合に備えて、substringは11%高速ですslicejsperf.com/js-slice-vs-substring-test
BenR

19
サブストリングは非常に微細な最適化であり、あなたがすべきではないと私は思います。最初に読みやすさを最大化します。次に、必要に応じて、ぶら下がっている果物を最適化します。
アルフレッド

1306

スライスが使えます!あなたはそれを使用する方法を知っていることを確認する必要があります。正の数は最初を基準とし、負の数は終点を基準とします。

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

75
受け入れられているソリューションと比較して、これはよりエレガントであり、動的に作成された文字列でも使用できます
Sameer Alibhai

1
私はこの方法が好きです。それはsubstr関数をphpで考えるので、覚えやすく、その場で書くのが簡単だからです。
パスファインダー2013年

2
@SameerAlibhai私はあなたに同意しますが、このsubstringメソッドは動的文字列にも使用できませんでしたか?str.lengthを使用して動的に長さを取得しますか?
Doug Molineux

最初のインデックスは包括的で、2番目のインデックスは排他的であることを追加する必要があります。
悪党

@KevinBealを使用すると、主流のブラウザーでF12を使用してコンソールに入力し、任意のページで機能し、コンテキストがあり、ライブラリーをロードすることもできます。
TWiStErRob 2015

263

JavaScript文字列オブジェクトのsubstringメソッドを使用できます。

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

stringから最後の4文字を無条件に削除しますs

ただし、最後の4文字を条件付きで削除する場合は、それらが正確に _bar次の場合に限られます

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

107
sliceここが良いです。s.slice(0, -4)
Tim Down

12
あるいは:s.slice(0、-"_ bar" .length)(文字数をハードコーディングしたくない場合に便利です)
Mahn

3
彼が指定されたエンディングを置き換えるための助けも与えるので、私はこれが好きです。
マイクグラフ

162

最も簡単な方法はslice、負の位置を許可する文字列のメソッドを使用することです(文字列の末尾からのオフセットに対応)。

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

最後のアンダースコアの後(およびアンダースコアを含む)をすべて削除するためのより一般的なものが必要な場合は、次の操作を実行できます(s少なくとも1つのアンダースコアが含まれていることが保証されている場合)。

const s = "your_string";
const withoutLastChunk = s.slice(0, s.lastIndexOf("_"));
console.log(withoutLastChunk);


67

あなたの例のような数については、これを上に行うことをお勧めしsubstringます:

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

ただし、これは実際には数値を四捨五入することになることに注意してください。

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


11
+1これはOPに必要なものです。トリミングする文字列があるという誤った仮定を忘れてください。
naugtur

2
それは誤った仮定ではありません、OPは文字列について話します。OPは数値の丸めについて話していないので、あなたの仮定は誤った仮定です。
Fernando

30

JavaScriptのスライス関数を使用する:

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

これは、任意の長さの文字列の末尾にある「_bar」を削除するために使用できます。


19

正規表現はあなたが探しているものです:

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


あなたの解決策は機能しますが、アレックスの答えはより包括的です。だから私は彼を受け入れます。ありがとう!
アルバート

1
これは、盲目的に切り捨てるのではなく、条件付き削除の関連する問題を解決します
Aaron



9

正規表現を使用する:

let aStr = "12345.00";
aStr = aStr.replace(/.$/, '');
console.log(aStr);


Unicode対応ではないことを除けば、これも改行と一致しません。
user4642212

7
  1. (。*)、任意の文字を複数回キャプチャします

console.log("a string".match(/(.*).$/)[1]);

  1. 。、この場合、最後の文字に一致します

console.log("a string".match(/(.*).$/));

  1. $、文字列の末尾に一致

console.log("a string".match(/(.*).{2}$/)[1]);


9
.splice()にもかかわらず正規表現を使用する方法を見つけたので、これが好きです。
QueueHammer 2013年

Unicode対応ではないことを除けば、これも改行と一致しません。
user4642212


5

楽しみのためだけに、他の回答では見たことがないと思う代替案を示します。

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

スライスや部分文字列ほど読みやすくまたは単純ではありませんが、いくつかの優れた配列メソッドを使用して文字列を操作できるので、知っておく価値があります。


4
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


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

編集:パオロが指摘するように、このための組み込み関数が存在するようです。その解決策は私のものよりも明らかにクリーンです。parseFloatの後にtoFixedを使用します




1

パフォーマンス

今日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)に対して2つのテストを実行します

  • 8文字の短い文字列(OP質問から)-実行できます HERE
  • 1M長い文字列のために-あなたはそれを実行することができますHERE

ソリューションは以下のスニペットに示されています

以下は、短い文字列のChromeの結果の例です

ここに画像の説明を入力してください


1

String.prototype.{ split, slice, substr, substring }UTF-16でエンコードされた文字列を操作することに注意してください

上記の答えはどれもUnicode対応ではありません。最新のほとんどのJavaScriptエンジンでは文字列はUTF-16としてエンコードされますが、より高いUnicodeコードポイントにはサロゲートペアが必要になるため、既存の既存の文字列メソッドは、UnicodeコードポイントではなくUTF-16コード単位で動作します。

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

dotAllまたはsフラグますが、.改行文字を一致させる、unicodeまたはuフラグが特定の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)、(U + FE0F)(U + 200D)、(U + 1F308)🏳️‍🌈のシーケンスで構成される、複数のコードポイントで構成されることに注意してください。ここでは、これを4つの「文字」に分割します。Unicodeプロパティエスケープシーケンスプロパティの提案を使用すると、これらを一致させることができます🏳VS16ZWJ🌈Array.from


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

-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/で実際に動作する例を試すこともできます。


3
ありがとうkamal。ただし、上記の回答は自分のニーズに応じて承認済みとしてマークしました。上の緑色のチェックマークに注目してください。しかし、私はあなたのコードをチェックしました。:)今、私の状況では、私は共通の終了文字シーケンスしか知りません。文字列の最後からチェックを開始することをお勧めします。「foo_b_bar」のような文字列があり、最後の「_bar」だけを取り出したい場合、提案は失敗します。ありがとう!2年以上前に質問しても、今日でも回答を受け取ることは非常に興味深い経験です。:)
Albert

-4

@ジェイソンS:

スライスが使えます!あなたはそれを使用する方法を知っていることを確認する必要があります。正の数は最初を基準とし、負の数は終点を基準とします。

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

私の書記は申し訳ありませんが、以前の投稿には「jquery」というタグが付けられていました。つまり、slice()は部分文字列ではなくDOM要素を使用した操作のjQueryメソッドであるため、jQuery 内でslice()を使用することはできません ...言い換えると、@ Jon Erickson本当に最適なソリューションを提案します。

ただし、メソッドはjQuery関数の外で、単純なJavascript内で機能します。コメントでの最後の議論のために、jQueryは、彼自身の最も有名なECMAScriptよりもはるかに頻繁にJSの更新可能な拡張機能であると言う必要があります。

ここにも2つの方法があります。

私たちのように:

string.substring(from,to) プラスとして、「to」インデックスがnullの場合、残りの文字列を返します。そう: string.substring(from) 正または負...

と他のいくつか-substr()-部分文字列と '長さ'の範囲を提供するものは正のみです string.substr(start,length)

また、一部のメンテナはstring.substr(start,length)、MSIEの最後の方法が機能しないか、エラーで機能すると示唆しています。


3
どういう意味ですか?String.prototype.sliceネイティブメソッドです
naugtur

それはあなたが言ったことだけです。JavaScriptネイティブメソッドだけでなくslice()、DOM操作用のjQuery メソッド:jQuery API:.slice()。そして確かに、それはJS Array.slice()の多相継承のように考えられますが、これは2つの異なるメソッドであり、区別する必要があると思います。したがって、これはこの知識の近似にすぎません。
迅速

12
.slice文字列である変数を呼び出すと、OPが望んでいたことを実行します。それが「jQueryの内部」であるかどうかは関係ありませんString.prototype。jQueryで上書きしない限り、それが「干渉」する方法はありません。jQueryで上書きしないと、JavaScriptコードが機能しなくなると確信しています。あなたの答えは、他の答えは良くなく、あなたが提供する議論は正しくないと言っているだけです。
naugtur

1
@naugturに同意できます。この答えは間違っています。文字列のスライスメソッドはjQueryの影響を受けません。
2013年

1
naugturが指摘した点は、可能であれば、jQueryオブジェクトでラップされた文字列で終わる可能性があることだと思います(たとえば、いくつかの空想的な.data操作を行い、この「文字列」で終わる場合)slice。あなたが望むことをしないでしょう。とは言っても、これは本当に役立つ答えではありません。
mAAdhaTTah 2016

-8

サブストリングを使用して、_barの左側にあるすべてのものを取得します。しかし、最初に文字列で_barのinstrを取得する必要があります。

str.substring(3, 7);

3はその開始、7は長さです。


1
これは、「foo_foo_bar」ではなく「foo_bar」でのみ機能します。問題は、既知の長さ以外の任意の長さの文字列に関するものでした。
Adrianによるデザイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.