JavaScript memotong / memotong / memangkas karakter terakhir dalam string

1974

Saya memiliki string,, 12345.00dan saya ingin mengembalikannya 12345.0.

Saya telah melihat trim, tetapi sepertinya itu hanya memangkas ruang kosong dan sliceyang saya tidak melihat bagaimana ini akan bekerja. Ada saran?

Phill Pafford
sumber
36
Apakah Anda peduli tentang pembulatan? 12345.46 = 12345.5 atau 12345.4?
RSolberg
9
Apakah Anda tahu apa sufiks itu atau Anda ingin membagi dan menghapus kata terakhir berdasarkan garis bawah Anda?
Cᴏʀʏ
65
Ho ho, @RSolberg: Anda tidak dapat membulatkan string!
Ziggy
50
@ Ziggy mengatakan apa? Math.round('0.5') === 1;)
TWiStErRob
16
@TWiStErRob Oh JavaScript, apa yang akan saya lakukan dengan Anda? * menggelengkan kepala *
Chuck Le Butt

Jawaban:

3215

Anda dapat menggunakan fungsi substring :

let str = "12345.00";
str = str.substring(0, str.length - 1);
console.log(str);

Ini adalah jawaban yang diterima, tetapi sesuai dengan percakapan di bawah ini, sintaks slice jauh lebih jelas:

let str = "12345.00";
str = str.slice(0, -1); 
console.log(str);

Jon Erickson
sumber
23
@ Hehe - notasi irisan jauh lebih bersih bagi saya. Saya sebelumnya menggunakan versi substring. Terima kasih!
Matt Ball
32
maafkan saya jika saya salah tetapi Anda tidak perlu menetapkan nilai str.substring ke str lagi? Sukastr = str.substring(0, str.length -1);
Doug Molineux
10
Metode slice& substringsemuanya hampir sama; kecuali bahwa slice()menerima indeks negatif, relatif terhadap akhir string, tetapi tidak substring, itu melempar out-of-boundkesalahan
Amol M Kulkarni
20
Jika ada yang bertanya-tanya, substring11% lebih cepat dari slice. jsperf.com/js-slice-vs-substring-test
BenR
19
substring adalah optimasi mikro gila yang saya pikir tidak harus Anda lakukan. Maksimalkan untuk keterbacaan pertama. Kemudian optimalkan buah yang menggantung rendah jika diperlukan.
Alfred
1306

Anda bisa menggunakan slice ! Anda hanya perlu memastikan bahwa Anda tahu cara menggunakannya. Positif # relatif terhadap awal, angka negatif relatif terhadap akhir.

js>"12345.00".slice(0,-1)
12345.0
Jason S
sumber
75
Dibandingkan dengan solusi yang diterima, ini jauh lebih elegan dan dapat digunakan bahkan dengan string yang dibuat secara dinamis
Sameer Alibhai
1
Saya suka cara ini karena bercampur dengan php untuk fungsi substr, lebih mudah diingat dan ditulis dengan cepat.
pathfinder
2
@SameerAlibhai Saya setuju dengan Anda, tetapi tidak dapatkah substringmetode ini digunakan pada string dinamis juga? Dengan menggunakan str.length untuk mendapatkan panjang secara dinamis?
Doug Molineux
Harus ditambahkan bahwa indeks pertama inklusif dan eksklusif kedua.
Miscreant
@KevinBeal Anda bisa menggunakan F12 di browser utama dan memasukkannya di Konsol, berfungsi di halaman mana pun dan Anda bahkan memiliki konteks dan perpustakaan dapat dimuat.
TWiStErRob
263

Anda dapat menggunakan metode substring objek string JavaScript:

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

Itu tanpa syarat menghapus empat karakter terakhir dari string s.

Namun, jika Anda ingin menghapus empat karakter terakhir secara kondisional , hanya jika mereka persis _bar :

var re = /_bar$/;
s.replace(re, "");
Alex Martelli
sumber
107
slicelebih baik di sini. s.slice(0, -4)
Tim Down
12
Atau: s.slice (0, - "_ bar" .length) (berguna jika seseorang tidak ingin meng-hardcode jumlah karakter)
Mahn
3
Saya suka yang ini karena dia juga memberikan bantuan untuk mengganti akhiran yang ditentukan.
Mike Graf
162

Metode termudah adalah dengan menggunakan slicemetode string, yang memungkinkan posisi negatif (sesuai dengan offset dari ujung string):

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

Jika Anda memerlukan sesuatu yang lebih umum untuk menghapus semuanya setelah (dan termasuk) garis bawah terakhir, Anda bisa melakukan yang berikut (asalkan sdijamin mengandung setidaknya satu garis bawah):

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

Tim Down
sumber
67

Untuk nomor seperti contoh Anda, saya akan merekomendasikan melakukan ini substring:

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

Harap perhatikan bahwa ini sebenarnya akan membulatkan angka, yang saya bayangkan diinginkan tetapi mungkin tidak:

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

Paolo Bergantino
sumber
11
+1 Inilah yang dibutuhkan OP, lupakan anggapan keliru bahwa ada string yang harus dipangkas.
naugtur
2
Ini bukan asumsi yang salah, OP berbicara tentang string. Anda adalah asumsi yang salah karena OP tidak berbicara tentang angka pembulatan.
Fernando
30

Menggunakan fungsi irisan JavaScript:

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

Ini dapat digunakan untuk menghapus '_bar' di akhir string, dengan panjang berapa pun.

Akshay Joshi
sumber
19

Ekspresi reguler adalah yang Anda cari:

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

w35l3y
sumber
Solusi Anda berfungsi, tetapi jawaban Alex lebih komprehensif. Jadi saya akan menerimanya. Terima kasih!
Albert
1
Ini memecahkan masalah terkait pemindahan bersyarat alih-alih memotong secara membabi buta
Aaron
10

Coba ini:

const myString = "Hello World!";
console.log(myString.slice(0, -1));

Somwang Souksavatd
sumber
9

Bagaimana tentang:

let myString = "12345.00";
console.log(myString.substring(0, myString.length - 1));

dariom
sumber
9

Gunakan regex:

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

Marc477
sumber
Selain tidak menyadari Unicode, ini juga tidak cocok dengan jeda baris.
user4642212
7
  1. (. *), menangkap karakter apa saja beberapa kali

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

  1. ., cocok dengan karakter terakhir, dalam hal ini

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

  1. $, cocok dengan akhir string

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

situs
sumber
9
Saya suka ini karena meskipun .splice () Anda menemukan cara untuk menggunakan ekspresi reguler.
QueueHammer
Selain tidak menyadari Unicode, ini juga tidak cocok dengan jeda baris.
user4642212
6

const str = "test!";
console.log(str.slice(0, -1));

dota2pro
sumber
3
Apa yang ditambahkan, dibandingkan dengan semua jawaban lainnya?
Dan Dascalescu
5

Berikut adalah alternatif yang menurut saya tidak pernah saya lihat di jawaban lain, hanya untuk bersenang-senang.

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

Tidak terbaca atau sesederhana slice atau substring tetapi memungkinkan Anda untuk bermain dengan string menggunakan beberapa metode array yang bagus, jadi perlu diketahui.

Tandai Walters
sumber
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
uofc
sumber
4

Cara terpendek:

str.slice(0, -1); 
Idan
sumber
3

Jika Anda ingin melakukan pembulatan float generik, alih-alih hanya memotong karakter terakhir:

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

EDIT: Sepertinya ada fungsi bawaan untuk ini, seperti yang ditunjukkan Paolo. Solusi itu jelas jauh lebih bersih daripada solusi saya. Gunakan parseFloat diikuti oleh toFixed

PatrikAkerstrand
sumber
1
if(str.substring(str.length - 4) == "_bar")
{
    str = str.substring(0, str.length - 4);
}
Matthew Flaschen
sumber
1

Performa

Hari ini 2020.05.13 Saya melakukan tes solusi yang dipilih pada Chrome v81.0, Safari v13.1 dan Firefox v76.0 pada MacOs High Sierra v10.13.6.

Kesimpulan

  • yang slice(0,-1)(D) cepat atau solusi tercepat untuk string pendek dan panjang dan dianjurkan secepat solusi lintas-browser
  • solusi berdasarkan substring(C) dan substr(E) cepat
  • solusi berdasarkan ekspresi reguler (A, B) lambat / sedang cepat
  • solusi B, F dan G lambat untuk string panjang
  • solusi F paling lambat untuk string pendek, G paling lambat untuk string panjang

masukkan deskripsi gambar di sini

Detail

Saya melakukan dua tes untuk solusi A , B , C , D , E ( ext ), F , G (saya)

  • untuk string pendek 8-char (dari pertanyaan OP) - Anda dapat menjalankannya DI SINI
  • untuk string 1M panjang - Anda dapat menjalankannya DI SINI

Solusi disajikan dalam cuplikan di bawah ini

Berikut adalah contoh hasil untuk Chrome untuk string pendek

masukkan deskripsi gambar di sini

Kamil Kiełczewski
sumber
1

Sadarilah itu String.prototype.{ split, slice, substr, substring } beroperasi pada string yang dikodekan UTF-16

Tidak ada jawaban sebelumnya yang sadar Unicode. String dikodekan sebagai UTF-16 di sebagian besar mesin JavaScript modern, tetapi poin kode Unicode yang lebih tinggi membutuhkan pasangan pengganti , sehingga metode string yang sudah ada sebelumnya beroperasi pada unit kode UTF-16, bukan titik kode 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"

Selain itu, jawaban RegExp tidak cocok dengan jeda baris di akhir dalam formulir saat ini:

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

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


Gunakan iterator string untuk beralih karakter

Kode Unicode-aware memanfaatkan iterator string; melihat Array.fromdan ...menyebar . string[Symbol.iterator]dapat digunakan (misalnya, bukanstring ) juga.

Juga lihat Cara membagi string Unicode ke karakter dalam JavaScript .

Contoh:

const string = "ẞ🦊";

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

Gunakan tanda sdan upada aRegExp

The dotAllatau sbendera merek .sesuai garis karakter istirahat, para unicodeatau ubendera memungkinkan tertentu fitur Unicode terkait.

Contoh:

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


Perhatikan bahwa beberapa grapheme terdiri dari lebih dari satu titik kode, misalnya 🏳️‍🌈yang terdiri dari urutan 🏳(U + 1F3F3), VS16(U + FE0F) , ZWJ(U + 200D) , 🌈(U + 1F308). Di sini, bahkan Array.fromakan membaginya menjadi empat "karakter". Mencocokkan itu dimungkinkan dengan properti Unicode lolos proposal properti urutan .

pengguna4642212
sumber
-1

Dalam kasus di mana Anda ingin menghapus sesuatu yang dekat dengan akhir string (dalam kasus string berukuran variabel) Anda dapat menggabungkan slice () dan substr ().

Saya memiliki string dengan markup, dibangun secara dinamis, dengan daftar tag jangkar yang dipisahkan oleh koma. Tali itu seperti:

var str = "<a>text 1,</a><a>text 2,</a><a>text 2.3,</a><a>text abc,</a>";

Untuk menghapus koma terakhir saya lakukan yang berikut:

str = str.slice(0, -5) + str.substr(-4);
bestafubana
sumber
-3

Coba ini:

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

Anda juga dapat mencoba contoh langsung di http://jsfiddle.net/informativejavascript/F7WTn/87/ .

kamal
sumber
3
Terima kasih kamal. Namun, saya telah menandai jawaban di atas yang diterima untuk kebutuhan saya. Perhatikan tanda centang hijau di atas. Padahal, saya memang memeriksa kode Anda. :) Sekarang, dalam situasi saya, saya hanya tahu urutan karakter akhir yang umum. Akan lebih baik untuk mulai memeriksa dari ujung string. Saran Anda akan gagal jika saya memiliki string yang mirip "foo_b_bar", dan saya hanya ingin menghapus "_bar" terakhir. Terimakasih Meskipun! Ini pengalaman yang cukup menarik untuk mengajukan pertanyaan lebih dari 2 tahun yang lalu, dan masih menerima jawaban untuknya hari ini. :)
Albert
-4

@Jason S:

Anda bisa menggunakan slice! Anda hanya perlu memastikan bahwa Anda tahu cara menggunakannya. Positif # relatif terhadap awal, angka negatif relatif terhadap akhir.

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

Maaf untuk graphomany saya tetapi posting ditandai 'jquery' sebelumnya. Jadi, Anda tidak dapat menggunakan slice () di dalam jQuery karena slice () adalah metode jQuery untuk operasi dengan elemen DOM, bukan substring ... Dengan kata lain jawaban @ Jon Erickson menyarankan solusi yang sangat sempurna.

Namun, metode Anda akan berfungsi di luar fungsi jQuery, di dalam Javascript sederhana. Perlu dikatakan karena diskusi terakhir dalam komentar, bahwa jQuery jauh lebih sering diperpanjang ekstensi JS daripada orang tuanya ECMAScript paling dikenal.

Di sini juga ada dua metode:

sebagai kami:

string.substring(from,to) sebagai plus jika 'to' index nulled mengembalikan sisa string. jadi: string.substring(from) positif atau negatif ...

dan beberapa lainnya - substr () - yang menyediakan kisaran substring dan 'panjang' hanya bisa positif: string.substr(start,length)

Juga beberapa pengelola menyarankan bahwa metode terakhir string.substr(start,length)tidak berfungsi atau bekerja dengan kesalahan untuk MSIE.

cepat
sumber
3
Apa maksudmu? String.prototype.sliceadalah metode asli
naugtur
hanya apa yang Anda katakan. Metode asli Javascript, tetapi juga slice()metode jQuery untuk manipulasi DOM: jQuery API: .slice () . DAN PASTI, itu DAPAT DIGAMBAR seperti warisan polimorfik dari JS Array.slice (), tetapi ini adalah dua metode yang berbeda, dan saya pikir perlu membedakannya. Jadi itu hanya perkiraan untuk pengetahuan ini.
cepat
12
Jika Anda memanggil .slicevariabel yang merupakan string, itu akan melakukan apa yang diinginkan OP. Tidak masalah jika itu "di dalam jQuery" dan tidak ada cara itu bisa "mengganggu" dengan cara apa pun kecuali Anda menimpa String.prototypejQuery, yang saya yakin akan mencegah APAPUN kode javascript bekerja. Jawaban Anda hanya mengatakan bahwa jawaban lain tidak baik dan argumen yang Anda berikan salah.
naugtur
1
Saya bisa setuju dengan @naugtur jawaban ini salah, metode slice string tidak dipengaruhi oleh jQuery.
Mengulang
1
Saya pikir titik yang dibuat oleh naugtur adalah bahwa, layaknya, Anda bisa berakhir dengan string yang dibungkus oleh objek jQuery (misalnya jika Anda melakukan .datamanipulasi mewah dan berakhir dengan "string" ini), yang jika Anda memanggilnya slice, tidak akan melakukan apa yang Anda inginkan. Yang mengatakan, ini bukan jawaban yang sangat membantu.
mAAdhaTTah
-8

Gunakan substring untuk mendapatkan segalanya di sebelah kiri _bar. Tetapi pertama-tama Anda harus mendapatkan petunjuk _bar di string:

str.substring(3, 7);

3 adalah awal dan 7 adalah panjangnya.

grieg
sumber
1
ini hanya bekerja pada "foo_bar" bukan pada "foo_foo_bar", pertanyaannya adalah tentang string dengan panjang apa pun tetapi akhir yang diketahui.
Desain oleh Adrian