Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Liczby i JEDNA kropka w input
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Edric
Witam.
Chcę stworzyć input, który na bieżąco będzie sprawdzał, co użytkownik wpisuje do pola input i pozwoli mu tylko na wpisanie liczby w postaci ułamka dziesiętnego. Czyli ogólnie - dowolna ilość cyfr i tylko jedna kropka po drodze. Udało mi się znaleźć na forum wyrażenie regularne, które mi w tym pomogło, ale udało mi się uzyskać tylko funkcję, która pozwala na wpisywanie dowolnej ilości liczb oraz kropek... Co zrobić, żeby działało to poprawnie?
  1. <script type="text/javascript">
  2.  
  3. function sprawdz()
  4. {
  5. if (!document.form.cena_n.value.match(/^(\d+)?([.]|\d+)?$/))
  6. document.form.cena_n.value=document.form.cena_n.value.replace(/[^0-9.]/,"");
  7. }
  8.  
  9. </head>
  10. <form name="form" >
  11. <input type="text" name="cena_n" id="cena_n" onkeyup ="sprawdz()"/>
  12. </form>
  13. </body>
  14. </html>
Shili
Kod
if (!document.form.cena_n.value.match(/^(\d+)?([\.]|\d+)?$/))
document.form.cena_n.value=document.form.cena_n.value.replace(/(?:[^0-9]*)$/,"");
document.form.cena_n.value=document.form.cena_n.value.replace(/(?:[^0-9]*)([0-9]*)(\.{1})([0-9]*)(?:[^0-9]*)/,"$1$2$3");
}


W swoim warunku co prawda wyrażenie nie pasuje do wpisanego ciągu, ale każesz zamieniać wszystko prócz wszystkich znaków i wszystkich kropek.
Pierwsza dodana zamiana jest potrzebna z tego względu, że zamienia na ciąg pusty wszystkie nieprawidłowe znaki wpisane na początku inputa (nie udało mi się tego osiągnąć w jednym replace'ie. Druga zamienia w ten sposób, że pobiera cyfry przed kropką, pierwszą kropkę i cyfry po kropce wpisuje je do zmiennych $1-$3, a olewa wszystkie inne; wystarczyło więc zastąpić cały wpisany tekst tylko tymi pobranymi poprawnymi wartościami. Problem jest tylko jeden - jeśli się wpisze dwie kropki pod rząd to usuwa obie. Ale jeśli nie będą pod rząd zostawi tą pierwszą.
Edric
Dziękuję - działa, tak jak napisałeś smile.gif. Możesz dokładniej wytłumaczyć, co jest nie tak z tym warunkiem?
Shili
Napisałaś.

Z którym dokładnie? Z tym pierwszym który przepuszczał dużo kropek czy z tym moim usuwającym dwie kropki pod rząd?
Edric
Cytat(Shili @ 20.06.2008, 00:29:03 ) *
Napisałaś.

Przepraszam, nie zorientowałem się po nicku smile.gif

Cytat(Shili @ 20.06.2008, 00:29:03 ) *
Z którym dokładnie? Z tym pierwszym który przepuszczał dużo kropek czy z tym moim usuwającym dwie kropki pod rząd?


W pierwszym. W tym o którym napisałaś "W swoim warunku co prawda wyrażenie nie pasuje do wpisanego ciągu..". Czyli ogólnie w tym kodzie, który podałem na początku.
Shili
Ok. Ogólnie chodzi o to, że ten if
Kod
if (!document.form.cena_n.value.match(/^(\d+)?([.]|\d+)?$/))
Faktycznie "powie" że wyrażenie z wieloma kropkami jest nieprawidłowe, więc wykona się następna linijka, także tutaj wszystko jest poprawne.

Ale trzeba przeanalizować tą kolejną linijkę właśnie, bo to ona przepuszcza więcej kropek niż jedną.
Kod
  document.form.cena_n.value=document.form.cena_n.value.replace(/[^0-9.]/,"");

To zotaje wywołane jak już było powiedziane w momencie, gdy w input zostaje wpisana więcej niż jedna kropka lub jakikolwiek inny znak niż cyfra. Jednak sama składnia wyrażenia każe zamieniać wszystkie znaki inne niż kropki i cyfry 0-9. Składnia [^0-9.] nie ogranicza liczby kropek do jednej, ale mówi: pobierz znaki inne od każdej cyfry i KAŻDEJ kropki jaką napotkasz w inpucie i je zamień na "nic".
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.