Usuń / obetnij wiodące zera za pomocą javascript / jquery


86

Zaproponuj rozwiązanie usuwania lub obcinania wiodących zer z liczby (dowolnego ciągu) przez javascript, jquery.


4
co powinno się stać, gdy ciąg ma wartość „000000000”
robert

Czy liczba zawsze powinna być liczbą całkowitą, czy powinna obsługiwać liczby z miejscami dziesiętnymi (np. '00000.5')?
Christian C. Salvadó

powinno dać pracę dla dowolnego podanego ciągu. tzn. „00000evsdd” powinno dać „evsdd”, „00000.5” powinno dać „.5”
Somnath Muluk,

Odpowiedzi:


197

Możesz użyć wyrażenia regularnego dopasowującego zera na początku ciągu:

s = s.replace(/^0+/, '');

13
@SomnathMuluk: to będzie niespodzianka dla wielu programistów javascript!
Bert

@Guffa: Używam go w kodzie jQuery .. może to być spowodowane tym, że może nie działać.
Somnath Muluk

2
@Somnath, jQuery IS javascript. Jeśli coś działa w javascript, będzie nadal działać, jeśli również używasz jQuery.
Abe Miessler

5
Dlaczego głos przeciw? Jeśli nie wyjaśnisz, co Twoim zdaniem jest złe, nie poprawi to odpowiedzi.
Guffa

2
s = s.replace (/ ^ 0 + /, '') przekonwertuje "00" na in "" (pusty ciąg zamiast łańcucha z jednym zerem), co w większości przypadków jest niepożądane, lepiej zamknąć go w funkcji i dodaj linię: if (s == "") s = "0";
Oliver Konig

31

Użyłbym funkcji Number ():

var str = "00001";
str = Number(str).toString();
>> "1"

Albo pomnożyłbym swój ciąg przez 1

var str = "00000000002346301625363";
str = (str * 1).toString();
>> "2346301625363"

2
nie zadziała z wartością większą niż 2 ^ 53. Number („009007199254740993”). ToString () będzie mieć wartość „9007199254740992”
madreason

13

Może trochę późno, ale chcę dodać moje 2 centy.

jeśli twój ciąg ZAWSZE reprezentuje liczbę, z możliwymi zerami wiodącymi, możesz po prostu rzutować ciąg na liczbę za pomocą operatora „+”.

na przykład

x= "00005";
alert(typeof x); //"string"
alert(x);// "00005"

x = +x ; //or x= +"00005"; //do NOT confuse with x+=x, which will only concatenate the value
alert(typeof x); //number , voila!
alert(x); // 5 (as number)

jeśli twój ciąg nie reprezentuje liczby i musisz usunąć tylko 0, użyj innych rozwiązań, ale jeśli potrzebujesz ich tylko jako liczby, jest to najkrótsza droga.

i do Twojej wiadomości, możesz zrobić odwrotnie, wymusić na liczbach działanie jako łańcuchy, jeśli połączysz z nimi pusty ciąg, na przykład:

x = 5;
alert(typeof x); //number
x = x+"";
alert(typeof x); //string

mam nadzieję, że to komuś pomoże


nie zadziała z wartością większą niż 2 ^ 53. (+ „009007199254740993”). ToString () będzie mieć wartość „9007199254740992”
madreason

13

Ponieważ powiedziałeś „dowolny ciąg”, zakładam, że jest to również ciąg, którym chcesz się posługiwać.

"00012  34 0000432    0035"

Tak więc regex to najlepszy sposób:

var trimmed = s.replace(/\b0+/g, "");

Zapobiegnie to utracie wartości „000000”.

var trimmed = s.replace(/\b(0(?!\b))+/g, "")

Możesz zobaczyć działający przykład tutaj


3

Mam to rozwiązanie do obcinania wiodących zer (liczby lub dowolnego ciągu) w javascript:

<script language="JavaScript" type="text/javascript">
<!--
function trimNumber(s) {
  while (s.substr(0,1) == '0' && s.length>1) { s = s.substr(1,9999); }
  return s;
}

var s1 = '00123';
var s2 = '000assa';
var s3 = 'assa34300';
var s4 = 'ssa';
var s5 = '121212000';

alert(s1 + '=' + trimNumber(s1));
alert(s2 + '=' + trimNumber(s2));
alert(s3 + '=' + trimNumber(s3));
alert(s4 + '=' + trimNumber(s4));
alert(s5 + '=' + trimNumber(s5));
// end hiding contents -->
</script>

4
To niezbyt dobry kod. Sprawdzenie długości łańcucha jest całkowicie zbędne, nigdy nie zostanie oszacowane false. Użycie 9999jako drugiego parametru do substrnie jest potrzebne. Po prostu użyj while (s.substr(0,1) == '0') s = s.substr(1);. Poza tym ten fragment kodu wygląda na naprawdę stary, languageatrybut scripttagu jest przestarzały, a używanie komentarzy w scripttagach jest potrzebne tylko w przeglądarkach, które w ogóle nie rozumieją scripttagu, np. Internet Explorer 1.0.
Guffa


2

Spróbuj tego,

   function ltrim(str, chars) {
        chars = chars || "\\s";
        return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
    }

    var str =ltrim("01545878","0");

Więcej tutaj


ma problem z podaną wartością ciągu
Somnath Muluk

@SomnathMuluk: jaki problem. oto działający przykład jsfiddle.net/AxeUU
Gowri

2

Po prostu spróbuj pomnożyć przez jeden w następujący sposób:

„00123” * 1; // Pobierz jako numer
"00123" * 1 + ""; // Pobierz jako ciąg



1

Jeśli numer jest używany

"" + parseInt(str)

Jeśli liczba jest zmiennoprzecinkowa, użyj

"" + parseFloat(str)

0

W inny sposób bez wyrażenia regularnego:

function trimLeadingZerosSubstr(str) {
    var xLastChr = str.length - 1, xChrIdx = 0;
    while (str[xChrIdx] === "0" && xChrIdx < xLastChr) {
        xChrIdx++;
    }
    return xChrIdx > 0 ? str.substr(xChrIdx) : str;
}

Z krótkim ciągiem będzie szybszy niż regex ( jsperf )


0
const input = '0093';
const match = input.match(/^(0+)(\d+)$/);
const result = match && match[2] || input;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.