Dizedeki JavaScript karakterini / dilimini / sonunu kes


1973

Bir dizem var 12345.00ve geri dönmesini istiyorum 12345.0.

Baktım trim, ama görünüşe göre sadece beyaz alanı kırpıyor ve slicebunun nasıl çalışacağını görmüyorum. Herhangi bir öneri?


36
Yuvarlamayı önemsiyor musunuz? 12345.46 = 12345.5 veya 12345.4?
RSolberg

9
Son ekin ne olduğunu biliyor musunuz yoksa alt kelimelerinize göre son kelimeyi bölmek ve kaldırmak istiyor musunuz?
Cᴏʀʏ

65
Ho ho ho, @RSolberg: Bir ipi yuvarlayamazsın !
Ziggy

50
@Ziggy ne diyor? Math.round('0.5') === 1;)
TWiStErRob

16
@TWiStErRob Oh JavaScript, seninle ne yapacağım? * kafa sallıyor *
Chuck Le Butt

Yanıtlar:


3212

Alt dize işlevini kullanabilirsiniz :

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

Bu kabul edilen cevaptır, ancak aşağıdaki konuşmalara göre, dilim sözdizimi çok daha açıktır:

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


23
@Kheu - dilim gösterimi benim için çok daha temiz. Daha önce substring sürümünü kullanıyordum. Teşekkürler!
Matt Ball

32
yanılıyorsam beni affet ama tekrar str için str.substring değerini atamanıza gerek yok mu? Beğenstr = str.substring(0, str.length -1);
Doug Molineux

10
sliceVe substringyöntemleri her çoğu aynıdır; dışında slice()dize sonuna göre negatif bir dizin kabul, ancak değil, hata substringatarout-of-bound
Amol M Kulkarni

20
Herkesin merak etmesi durumunda, substring% 11 daha hızlıdır slice. jsperf.com/js-slice-vs-substring-test
BenR

19
substring, yapman gerektiğini düşünmediğim deli mikro optimizasyonlardır. Önce okunabilirliği en üst düzeye çıkarın. Daha sonra gerekirse düşük asılı meyveleri optimize edin.
Alfred

1306

Dilim kullanabilirsiniz ! Sadece nasıl kullanılacağını bildiğinizden emin olmalısınız. Pozitif #'ler başlangıca, negatif sayılar sona göredir.

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

75
Kabul edilen çözümle karşılaştırıldığında, bu çok daha zarif ve dinamik olarak oluşturulan dizelerle bile kullanılabilir
Sameer Alibhai

1
Bu şekilde seviyorum çünkü substr fonksiyonu için php düşünce ile anlıyor, hatırlanması ve anında yazılması daha kolay.
pathfinder

2
@SameerAlibhai Size katılıyorum, ancak substringyöntem dinamik dizelerde de kullanılamadı mı? Dinamik olarak uzunluk elde etmek için str.length kullanarak?
Doug Molineux

İlk endeksin kapsayıcı ve ikinci münhasır olduğu da eklenmelidir.
Miscreant

@KevinBeal sadece F12'yi ana tarayıcılarda kullanabilir ve Konsol'a girebilir, herhangi bir sayfada çalışır ve hatta bağlamınız vardır ve kütüphaneler yüklü olabilir.
TWiStErRob

263

JavaScript dize nesnelerinin alt dize yöntemini kullanabilirsiniz :

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

Dizeden son dört karakteri koşulsuz olarak kaldırır s.

Ancak, son dört karakteri koşullu olarak kaldırmak istiyorsanız , yalnızca tam olarak oldukları takdirde _bar:

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

107
sliceburada daha iyi. s.slice(0, -4)
Tim Down

12
Alternatif olarak: s.slice (0, - "_ bar" .length) (karakter sayısını
Mahn

3
Bunu beğendim çünkü aynı zamanda belirtilen bir sonun değiştirilmesi için yardım veriyor.
Mike Graf

162

En kolay yöntem, slicedizenin negatif konumlara (dizenin sonundaki ofsete karşılık gelen) izin veren yöntemini kullanmaktır :

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

Son alt çizgiden sonra (ve dahil) her şeyi kaldırmak için daha genel bir şeye ihtiyacınız varsa, aşağıdakileri yapabilirsiniz ( sen az bir alt çizgi içereceği garanti edildiği sürece ):

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


67

Örneğiniz gibi bir sayı için bunu şu şekilde yapmanızı öneriyorum substring:

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

Bu aslında sayılır, ancak istenir ama belki değil hayal ediyorum yuvarlak olacağını unutmayın:

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


11
+1 OP'nin ihtiyacı olan budur, kırpılacak ipler olduğu yanlış varsayımını unutun.
naugtur

2
Bu yanlış bir varsayım değil, OP tellerden bahsediyor. Seninki yanlış bir varsayım çünkü OP sayıları yuvarlamaktan bahsetmiyor.
Fernando

30

JavaScript'in dilim işlevini kullanma:

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

Bu, bir dizenin sonunda herhangi bir uzunlukta '_bar' kaldırmak için kullanılabilir.


19

Düzenli ifade aradığınız şeydir:

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


Çözümünüz işe yarıyor, ancak Alex'in cevabı daha kapsamlı. Bu yüzden onu kabul edeceğim. Teşekkürler!
Albert

1
Bu, körü körüne kısaltmak yerine koşullu kaldırma ile ilgili bir sorunu çözüyor
Aaron


9

Nasıl olur:

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


9

Normal ifadeyi kullan:

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


Unicode farkında olmamanın yanı sıra, satır sonlarıyla da eşleşmiyor.
user4642212

7
  1. (. *), herhangi bir karakteri birden çok kez yakalar

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

  1. ., son karakterle eşleşir, bu durumda

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

  1. $, dizenin sonuyla eşleşir

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


9
Bunu sevdim çünkü .splice () öğesine rağmen normal bir ifade kullanmanın bir yolunu buldunuz.
QueueHammer

Unicode farkında olmamanın yanı sıra, satır sonlarıyla da eşleşmiyor.
user4642212


5

İşte diğer cevaplarda gördüğümü sanmıyorum bir alternatif, sadece eğlence için.

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

Dilim veya alt dize kadar okunaklı veya basit değil, ancak bilmeye değer bazı güzel dizi yöntemleri kullanarak dize ile oynamanıza izin veriyor.


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

Sadece son karakteri kırpmak yerine, kayan noktaların genel yuvarlamasını yapmak istiyorsanız:

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: Paolo'nun belirttiği gibi, bunun için yerleşik bir işlev var gibi görünüyor. Bu çözüm benimkinden çok daha temiz. ParseFloat ve ardından toFixed kullanın




1

Verim

Bugün 2020.05.13 Chrome v81.0, Safari v13.1 ve MacOs High Sierra v10.13.6'da Firefox v76.0'da seçilen çözümlerin testlerini yapıyorum.

Sonuçlar

  • slice(0,-1)(D) hızlı veya kısa ve uzun dizeleri için en hızlı çözüm ve hızlı çapraz tarayıcı çözüm olarak önerilmektedir
  • substring(C) ve substr(E) 'ye dayalı çözümler hızlıdır
  • düzenli ifadelere (A, B) dayalı çözümler yavaş / orta hızlıdır
  • B, F ve G çözeltileri uzun teller için yavaştır
  • F çözümü kısa teller için en yavaştır, G uzun teller için en yavaştır

resim açıklamasını buraya girin

ayrıntılar

A , B , C , D , E ( dahili ), F , G (my) çözeltileri için iki test yapıyorum

  • 8 karakterlik kısa dize için (OP sorusundan) - BURAYA çalıştırabilirsiniz
  • 1M uzun dize için - BURAYA çalıştırabilirsiniz

Çözümler aşağıdaki snippet'te sunulmaktadır

Kısa dizeli Chrome için örnek sonuçlar

resim açıklamasını buraya girin


1

Unutmayın String.prototype.{ split, slice, substr, substring }UTF-16 kodlu dizeleri üzerinde işlem

Önceki cevapların hiçbiri Unicode uyumlu değildir. Dizeler çoğu modern JavaScript motorunda UTF-16 olarak kodlanır, ancak daha yüksek Unicode kod noktaları yedek çiftler gerektirir , bu nedenle daha eski, önceden var olan dize yöntemleri Unicode kod noktalarında değil UTF-16 kod birimlerinde çalışır.

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"

Ayrıca, RegExp yanıtları, sondaki satır sonlarıyla şu anki formlarıyla eşleşmiyor:

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

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


Karakterleri yinelemek için dize yineleyicisini kullanma

Unicode farkında kod, dizenin yineleyicisini kullanır; görmek Array.fromve ...yaymak . string[Symbol.iterator]kullanılabilir (örneğin yerine string).

Ayrıca bkz. Unicode dizesini JavaScript'teki karakterlere bölme .

Örnekler:

const string = "ẞ🦊";

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

Kullanım sve ubir bayraklarRegExp

dotAllVeya sbayrak markaları .satır sonu karakterleri eşleştirmek, unicodeya ubayrak belli Unicode ilgili özellikleri sağlar.

Örnekler:

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


Bazı grafiklerin birden fazla kod noktasından 🏳️‍🌈oluştuğunu , örneğin 🏳(U + 1F3F3), VS16(U + FE0F) , ZWJ(U + 200D) , 🌈(U + 1F308) dizilerinden oluştuğunu unutmayın. Burada bile Array.fromdört karaktere bölünecek. Bunları Unicode özelliğiyle eşleştirmek, dizi özellikleri teklifinden kaçar .


-1

Bir dizenin sonuna yakın bir şeyi kaldırmak istediğiniz durumlarda (değişken boyutlu dizelerde) slice () ve substr () öğelerini birleştirebilirsiniz.

İşaretleme, dinamik olarak inşa edilmiş, virgülle ayrılmış bağlantı etiketleri listesi ile bir dize vardı. Dize şöyle bir şeydi:

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

Son virgül kaldırmak için aşağıdakileri yaptım:

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

-3

Bunu dene:

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

Canlı çalışma örneğini http://jsfiddle.net/informativejavascript/F7WTn/87/ adresinde de deneyebilirsiniz .


3
Teşekkürler kamal. Ancak yukarıdaki cevabı ihtiyaçlarım için kabul edilmiş olarak işaretledim. Yukarıdaki yeşil onay işaretine dikkat edin. Yine de, kodunuzu kontrol ettim. :) Şimdi, benim durumumda, sadece ortak son karakter dizisini biliyorum. Dizenin sonundan kontrol etmeye başlamak daha iyi olur. Öneriniz "foo_b_bar" gibi görünen bir dize varsa başarısız olur ve sadece son "_bar" almak istiyorum. Yine de teşekkürler! 2 yıl önce bir soru sormak ve bugün hala cevap almak oldukça ilginç bir deneyim. :)
Albert

-4

@Jason S:

Dilim kullanabilirsiniz! Sadece nasıl kullanılacağını bildiğinizden emin olmalısınız. Pozitif #'ler başlangıca, negatif sayılar sona göredir.

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

Grafiğim için özür dilerim, ancak mesaj daha önce 'jquery' olarak etiketlenmişti. Yani, sen kullanamazsınız dilim () çünkü jQuery içindeki dilim () cevap Başka bir deyişle DOM öğeleri değil, alt dizeleri ... ile operasyonlar için jQuery yöntemidir @Jon Erickson gerçekten mükemmel bir çözüm önermek.

Ancak, yönteminiz basit Javascript içinde jQuery işlevi dışında çalışır. Yorumlardaki son tartışmalar nedeniyle, jQuery'nin kendi ebeveyninin en çok bilinen ECMAScript'inden çok daha fazla yenilenebilir JS uzantısı olduğunu söylemeliyim.

Burada da iki yöntem vardır:

bizim gibi:

string.substring(from,to) 'artı' dizini boşsa, dizenin geri kalanını döndürür. yani: string.substring(from) pozitif veya negatif ...

ve alt dize ve 'uzunluk' aralığı sağlayan diğer bazı - substr () - yalnızca pozitif olabilir: string.substr(start,length)

Ayrıca bazı string.substr(start,length)koruyucular MSIE için son yöntemin çalışmadığını veya hatalı çalıştığını öne sürüyor .


3
Ne demek istiyorsun? String.prototype.slicedoğal bir yöntemdir
naugtur

sadece söylediklerin. Javascript yerel yöntemi, ancak aynı zamanda slice()DOM manipülasyonu için jQuery yöntemi: jQuery API: .slice () . VE Tabii ki, bu JS Array.slice () 'nin polimorfik bir mirasına benzetilebilir, ancak iki farklı yöntemdir ve bence bunu ayırmak gerekir. Bu sadece bu bilgiye bir yaklaşım.
hızlı

12
.sliceBir dize olan bir değişkeni çağırırsanız , OP'nin istediği şeyi yapar. Bu "jQuery içinde" olup olmadığı önemli değildir String.prototypeve jQuery ile üzerine yazmadığınız sürece herhangi bir şekilde "müdahale" hiçbir yolu yoktur , eminim HERHANGİ bir javascript kodu çalışmasını engelleyecektir. Cevabınız sadece diğer cevabın iyi olmadığını ve sağladığınız argümanın yanlış olduğunu söylüyor.
naugtur

1
@Naugtur ile bu sorunun yanlış olduğunu kabul edebilirim, dizenin dilim yöntemi jQuery tarafından etkilenmez.
reconbot

1
Naugtur'un yaptığı noktanın sadece, bir fıkra jQuery nesnesi tarafından sarılmış bir dize (örneğin, bazı fantezi .datamanipülasyonları yaparsanız ve bu "dize" ile bitirirseniz) olabileceğini slicedüşünüyorum. istediğini yapmazdım. Bununla birlikte, bu gerçekten yararlı bir cevap değil.
mAAdhaTTah

-8

_Bar'ın solundaki her şeyi almak için alt dize kullanın. Ama önce dizede _bar instr değerini almak zorundasınız:

str.substring(3, 7);

3 başlangıçtır ve 7 uzunluktur.


1
Bu sadece "foo_fo" üzerinde değil "foo_foo_bar" üzerinde çalışır, soru uzunluğu bilinen herhangi bir uzunluğu dışında bir dize ile ilgili idi.
Adrian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.