JavaScript taglia / taglia / taglia l'ultimo carattere nella stringa


1974

Ho una stringa 12345.00e vorrei che tornasse 12345.0.

Ho visto trim, ma sembra che stia solo tagliando gli spazi bianchi e sliceche non vedo come funzionerebbe. Eventuali suggerimenti?


36
Ti interessa l'arrotondamento? 12345.46 = 12345.5 o 12345.4?
RSolberg,

9
Sai qual è il suffisso o vuoi dividere e rimuovere l'ultima parola in base al carattere di sottolineatura?
Cᴏʀʏ

65
Ho ho ho, @RSolberg: non puoi arrotondare una stringa!
Ziggy,

50
@Ziggy dice cosa? Math.round('0.5') === 1;)
TWiStErRob il

16
@TWiStErRob Oh JavaScript, cosa ho intenzione di fare con te? * scuote la testa *
Chuck Le Butt

Risposte:


3216

È possibile utilizzare la funzione di sottostringa :

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

Questa è la risposta accettata, ma secondo le conversazioni di seguito, la sintassi della sezione è molto più chiara:

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


23
@Kheu - la notazione delle sezioni è molto più pulita per me. In precedenza utilizzavo la versione di sottostringa. Grazie!
Matt Ball

32
perdonami se sbaglio ma non hai bisogno di assegnare di nuovo il valore di str.substring a str? Comestr = str.substring(0, str.length -1);
Doug Molineux,

10
I metodi slice& substringsono tutti uguali; tranne per il fatto che slice()accetta un indice negativo, relativo alla fine della stringa, ma non il substring, genera un out-of-bounderrore
Amol M Kulkarni

20
Nel caso qualcuno si stia chiedendo, substringè dell'11% più veloce di slice. jsperf.com/js-slice-vs-substring-test
BenR

19
la sottostringa è micro-ottimizzazioni folli che non penso che dovresti fare. Massimizza per prima cosa la leggibilità. Quindi, se necessario, ottimizza la frutta bassa.
Alfred,

1306

Puoi usare slice ! Devi solo assicurarti di sapere come usarlo. I numeri positivi sono relativi all'inizio, i numeri negativi sono relativi alla fine.

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

75
Rispetto alla soluzione accettata, questo è molto più elegante e può essere utilizzato anche con stringhe create dinamicamente
Sameer Alibhai

1
Mi piace in questo modo perché jives con php pensa alla funzione substr, più facile da ricordare e scrivere al volo.
Pathfinder

2
@SameerAlibhai Sono d'accordo con te, ma il substringmetodo non può essere utilizzato anche su stringhe dinamiche? Usando la str.length per ottenere dinamicamente la lunghezza?
Doug Molineux,

Va aggiunto che il primo indice è inclusivo e il secondo esclusivo.
Miscreant

@KevinBeal puoi semplicemente usare F12 nei browser tradizionali e inserirlo nella Console, funziona su qualsiasi pagina e hai persino un contesto e puoi caricare le librerie.
TWiStErRob,

263

È possibile utilizzare il metodo di sottostringa degli oggetti stringa JavaScript:

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

Rimuove incondizionatamente gli ultimi quattro caratteri dalla stringa s.

Tuttavia, se si desidera rimuovere in modo condizionale gli ultimi quattro caratteri, solo se sono esattamente _bar :

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

107
sliceè meglio qui. s.slice(0, -4)
Tim Down,

12
In alternativa: s.slice (0, - "_ bar" .length) (utile se non si vuole codificare il numero di caratteri)
Mahn

3
Mi piace questo perché dà anche aiuto per sostituire un finale specificato.
Mike Graf,

162

Il metodo più semplice è utilizzare il slicemetodo della stringa, che consente posizioni negative (corrispondenti agli offset dalla fine della stringa):

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

Se hai bisogno di qualcosa di più generale per rimuovere tutto dopo (e incluso) l'ultimo carattere di sottolineatura, puoi fare quanto segue (purché ssia garantito che contenga almeno un carattere di sottolineatura):

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


67

Per un numero come il tuo esempio, consiglierei di fare questo sopra substring:

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

Si noti che questo in realtà arrotonderà il numero, tuttavia, che immagino sia desiderato ma forse no:

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


11
+1 Questo è ciò di cui ha bisogno l'OP, dimentica la falsa ipotesi che ci siano delle stringhe da tagliare.
naugtur,

2
Non è un falso presupposto, OP parla di stringhe. Il tuo è un falso presupposto perché OP non parla di arrotondamento dei numeri.
Fernando,

30

Utilizzando la funzione slice di JavaScript:

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

Questo potrebbe essere usato per rimuovere '_bar' alla fine di una stringa, di qualsiasi lunghezza.


19

Un'espressione regolare è ciò che stai cercando:

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


La tua soluzione funziona, ma la risposta di Alex è più completa. Quindi accetterò il suo. Grazie!
Albert,

1
Questo risolve un problema correlato alla rimozione condizionale piuttosto che al troncamento cieco
Aaron,


9

Che ne dite di:

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


9

Usa regex:

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


Oltre a non essere a conoscenza di Unicode, anche questo non corrisponde alle interruzioni di riga.
user4642212

7
  1. (. *), cattura ogni personaggio più volte

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

  1. ., corrisponde all'ultimo carattere, in questo caso

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

  1. $, corrisponde alla fine della stringa

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


9
Mi piace perché, nonostante .splice () hai trovato il modo di usare un'espressione regolare.
QueueHammer,

Oltre a non essere a conoscenza di Unicode, anche questo non corrisponde alle interruzioni di riga.
user4642212


5

Ecco un'alternativa che non credo di aver visto nelle altre risposte, solo per divertimento.

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

Non leggibile o semplice come lo slice o la sottostringa ma ti permette di giocare con la stringa usando alcuni metodi array utili, quindi vale la pena saperlo.


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

4

Il modo più breve:

str.slice(0, -1); 

3

Se vuoi fare un arrotondamento generico di float, invece di tagliare solo l'ultimo carattere:

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: Sembra che esista una funzione integrata per questo, come sottolinea Paolo. Questa soluzione è ovviamente molto più pulita della mia. Usa parseFloat seguito da toFixed


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


1

Prestazione

Oggi 2020.05.13 eseguo test delle soluzioni scelte su Chrome v81.0, Safari v13.1 e Firefox v76.0 su MacOs High Sierra v10.13.6.

conclusioni

  • la slice(0,-1)(D) è la soluzione più veloce o più veloce per stringhe corte e lunghe ed è consigliata come soluzione cross-browser veloce
  • le soluzioni basate su substring(C) ed substr(E) sono veloci
  • le soluzioni basate su espressioni regolari (A, B) sono lente / medio veloci
  • le soluzioni B, F e G sono lente per le corde lunghe
  • la soluzione F è la più lenta per le stringhe corte, la G è la più lenta per le stringhe lunghe

inserisci qui la descrizione dell'immagine

Dettagli

Eseguo due test per le soluzioni A , B , C , D , E ( ext ), F , G (my)

  • per una stringa breve da 8 caratteri (dalla domanda OP) - puoi eseguirla QUI
  • per 1 m di stringa lunga: puoi eseguirlo QUI

Le soluzioni sono presentate nello snippet seguente

Ecco alcuni risultati di esempio per Chrome per stringa corta

inserisci qui la descrizione dell'immagine


1

Tenere presente che String.prototype.{ split, slice, substr, substring }operano su stringhe codificate UTF-16

Nessuna delle risposte precedenti è compatibile con Unicode. Le stringhe sono codificate come UTF-16 nella maggior parte dei moderni motori JavaScript, ma i punti di codice Unicode più elevati richiedono coppie surrogate , quindi i metodi di stringa preesistenti più vecchi operano su unità di codice UTF-16, non su punti di codice 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"

Inoltre, le risposte RegExp non corrispondono alle interruzioni di riga alla fine nella loro forma corrente:

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

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


Utilizzare l'iteratore di stringhe per iterare i caratteri

Il codice compatibile con Unicode utilizza l'iteratore della stringa; vedere Array.frome ...diffondere . string[Symbol.iterator]può essere utilizzato (ad es. anzichéstring ).

Vedi anche Come dividere la stringa Unicode in caratteri in JavaScript .

Esempi:

const string = "ẞ🦊";

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

Utilizzare i flag se usu aRegExp

Il flag dotAllos crea .caratteri di interruzione di riga di corrispondenza, il flag unicodeou abilita alcune funzionalità relative a Unicode.

Esempi:

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


Si noti che alcuni grafemi sono costituiti da più di un punto di codice, ad es. 🏳️‍🌈Che consiste nella sequenza 🏳(U + 1F3F3), VS16(U + FE0F) , ZWJ(U + 200D) , 🌈(U + 1F308). Qui, anche Array.fromdividerà questo in quattro "personaggi". La corrispondenza di questi è possibile con la proprietà Unicode sfugge alla proposta delle proprietà della sequenza .


-1

Nei casi in cui si desidera rimuovere qualcosa che si trova vicino alla fine di una stringa (nel caso di stringhe di dimensioni variabili) è possibile combinare slice () e substr ().

Avevo una stringa con markup, costruita dinamicamente, con un elenco di tag di ancoraggio separati da virgola. La stringa era qualcosa del tipo:

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

Per rimuovere l'ultima virgola ho fatto quanto segue:

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

-3

Prova questo:

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

Puoi anche provare l'esempio di lavoro dal vivo su http://jsfiddle.net/informativejavascript/F7WTn/87/ .


3
Grazie Kamal. Tuttavia, ho contrassegnato la risposta sopra come accettata per le mie esigenze. Notare il segno di spunta verde sopra. Tuttavia, ho controllato il tuo codice. :) Ora, nella mia situazione, conosco solo la sequenza comune di caratteri finali. Sarebbe meglio iniziare a controllare dalla fine della stringa. Il tuo suggerimento fallirebbe se avessi una stringa che assomiglia a "foo_b_bar" e voglio solo eliminare l'ultimo "_bar". Grazie comunque! È un'esperienza piuttosto interessante fare una domanda oltre 2 anni fa e ricevere ancora risposte per questo oggi. :)
Albert,

-4

@Jason S:

Puoi usare slice! Devi solo assicurarti di sapere come usarlo. I numeri positivi sono relativi all'inizio, i numeri negativi sono relativi alla fine.

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

Ci scusiamo per la mia grafica ma il post è stato taggato "jquery" in precedenza. Quindi, non puoi usare slice () all'interno di jQuery perché slice () è il metodo jQuery per operazioni con elementi DOM, non sottostringhe ... In altre parole, la risposta di @Jon Erickson suggerisce una soluzione davvero perfetta.

Tuttavia, il tuo metodo funzionerà con la funzione jQuery, all'interno di Javascript semplice. Devo dire a causa dell'ultima discussione nei commenti, che jQuery è molto più spesso un'estensione rinnovabile di JS rispetto al suo genitore ECMAScript più noto.

Qui esistono anche due metodi:

come il nostro:

string.substring(from,to) come plus se l'indice 'to' annullato restituisce il resto della stringa. quindi: string.substring(from) positivo o negativo ...

e alcuni altri - substr () - che forniscono un intervallo di sottostringa e 'lunghezza' possono essere solo positivi: string.substr(start,length)

Inoltre alcuni manutentori suggeriscono che l'ultimo metodo string.substr(start,length)non funziona o funziona con errori per MSIE.


3
Cosa intendi? String.prototype.sliceè un metodo nativo
naugtur

è solo quello che hai detto. Metodo nativo Javascript, ma anche slice()metodo jQuery per manipolazione DOM: API jQuery: .slice () . E SICURO, che PUO 'ESSERE FIGURATO come un'eredità polimorfica di JS Array.slice (), ma si tratta di due metodi diversi, e penso che debba distinguerlo. Quindi è solo un'approssimazione di questa conoscenza.
rapido

12
Se chiamate .sliceuna variabile che è una stringa, farà esattamente quello che voleva l'OP. Non importa se è "dentro jQuery" e non c'è modo di "interferire" in alcun modo se non si sovrascrive String.prototypecon jQuery, che sono sicuro impedirà a QUALSIASI codice javascript di funzionare. La tua risposta dice solo che l'altra risposta non è buona e l'argomento fornito non è corretto.
naugtur,

1
Sono d'accordo con @naugtur che questa risposta è sbagliata, il metodo slice della stringa non è influenzato da jQuery.
Riconbotta l'

1
Penso che il punto che naugtur stava sottolineando fosse proprio quello, fattibilmente, che potresti finire con una stringa avvolta da un oggetto jQuery (ad esempio se fai qualche .datamanipolazione fantasiosa e finisci con questa "stringa"), che se lo chiamassi slice, non farebbe quello che vuoi. Detto questo, questa non è davvero una risposta utile.
mAAdhaTTah,

-8

Usa la sottostringa per ottenere tutto alla sinistra di _bar. Ma prima devi ottenere l'istruzione di _bar nella stringa:

str.substring(3, 7);

3 è quell'inizio e 7 è la lunghezza.


1
questo funziona solo su "foo_bar" non su "foo_foo_bar", la domanda riguardava una stringa di qualsiasi lunghezza ma una fine nota.
Design di Adrian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.