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.