Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Liczby i JEDNA kropka w input, Wyrażenia regularne
Edric
post 19.06.2008, 12:59:43
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 23.04.2007

Ostrzeżenie: (0%)
-----


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>
Go to the top of the page
+Quote Post
Shili
post 19.06.2008, 14:11:35
Post #2





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post
Edric
post 19.06.2008, 23:27:52
Post #3





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 23.04.2007

Ostrzeżenie: (0%)
-----


Dziękuję - działa, tak jak napisałeś smile.gif. Możesz dokładniej wytłumaczyć, co jest nie tak z tym warunkiem?
Go to the top of the page
+Quote Post
Shili
post 19.06.2008, 23:29:03
Post #4





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Edric
post 20.06.2008, 11:19:12
Post #5





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 23.04.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Shili
post 20.06.2008, 11:46:37
Post #6





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował Shili 20.06.2008, 11:47:56
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.07.2025 - 02:58