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.

Somnath Muluk
źródło
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+/, '');
Guffa
źródło
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"
Jade Hamel
źródło
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

DiegoDD
źródło
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

John Fisher
źródło
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>
Somnath Muluk
źródło
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
3
parseInt(value) or parseFloat(value)

To będzie dobrze działać.

Krupall
źródło
Ale nie dla liczb dziesiętnych
Stephen Burke
@ sburke0708 - Tak, będzie? To właśnie robi parseFloat.
Sinister Beard
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

Gowri
źródło
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

Siyavash Hamdi
źródło
1

Jeśli numer jest używany

"" + parseInt(str)

Jeśli liczba jest zmiennoprzecinkowa, użyj

"" + parseFloat(str)
loki_dev
źródło
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 )

madreason
źródło
0
const input = '0093';
const match = input.match(/^(0+)(\d+)$/);
const result = match && match[2] || input;
Boney
źródło