2013-07-05 16 views
5

Potrzeba wyrażenia regularnego, które: (.) ​​Wyrażenie regularne do sprawdzania cen

  1. Maksymalnie 8 cyfr przed przecinku wskazać
  2. maksymalnie 4 cyfry po punkcie dziesiętnym
  3. przecinka jest opcjonalny

Maksymalna poprawna wartość dziesiętna to 8 cyfr przed dziesiętnym i 4 cyfr po dziesiętnym Tak 99999999.9999

Zwykła ekspresja, którą wypróbowałem: ^\ d {0,8} [.]? \ D {1,4} zawodzi w przypadku 123456789 i więcej. oznacza, że ​​zajmuje więcej niż 8 cyfr, jeśli przecinek dziesiętny nie jest dostępny.

Testowany tutaj: http://regexpal.com/

wiele wiele dzięki z góry!

+0

Cena nie może być ujemna? –

+0

Nie, nie w moim przypadku! – user2338652

Odpowiedz

7
^\d{0,8}(\.\d{1,4})?$ 

Możesz zrobić całą przecinku opcjonalnego

+1

Musisz umieścić odwrotny ukośnik przed kropką (kropka): tj. '(\. \ D {1,4}) ? w przeciwnym razie akceptujesz DOWOLNE znaki, w tym inną cyfrę. –

5

Można spróbować to:

^\d{1,8}(?:\.\d{1,4})?$ 

lub

^[1-9]\d{0,7}(?:\.\d{1,4})?$ 

Jeśli nie chcesz mieć zero jako pierwsza cyfra.

Można to pozwolić, jeśli chcesz: (.1234)

^[1-9]\d{0,7}(?:\.\d{1,4})?|\.\d{1,4}$ 
+0

Dziękujemy za superszybką odpowiedź! Widzę, że to nie działa .12345678 Powinno to zająć tylko .1234. – user2338652

+0

@ user2338652, jeśli spodziewasz się, że wartość będzie miała maksymalnie 4 cyfry po przecinku. Nie powinieneś akceptować danych wejściowych, jeśli ich wartość większa od 4. może prowadzić do ** zaokrągleń ** błędów ... właśnie ** nie należy * * zaakceptuj dane wejściowe, jeśli nie pasują do twoich kryteriów .. i ** valiadation! = dopasuj ** – Anirudha

+0

@ user2338652 FYI, odpowiedź, którą zaakceptowałeś również "zawiedzie" na '.123456789'. –

3

Każda z powyższych nie działa dla mnie. Tylko to działa dla mnie

^([0-9]{0,2}((.)[0-9]{0,2}))$