2013-04-17 5 views
3

Я пытаюсь разрешить только цифры и специальные символы типа '.' и ',' разрешено в моей текстовой строке. для этого я пробовал следующий кодРегулярное выражение для действительного числа с необязательными запятыми и точкой

var pattern = /[A-Za-z]/g; 
var nospecial=/[\(#\$\%_+~=*!|\":<>[\]{}`\\)';@&?$]/g; 
if (!ev.ctrlKey && charCode!=9 && charCode!=8 && charCode!=36 && charCode!=37 && charCode!=38 && (charCode!=39 || (charCode==39 && text=="'")) && charCode!=40) { 
    console.log(text); 
    if (!pattern.test(text) && !nospecial.test(text)) { 
     console.log('if'); 
     return true; 
    } else { 
     console.log('else'); 
     return false; 
    } 
} 

, но не получил желаемый результат. скажи мне, где я ошибаюсь.

+2

Видя ответ @ smerny, кажется, что вы хотите что-то немного отличающееся от того, что вы впервые задали. В противном случае вы просто сможете сделать '/^[0-9.,] * $ /'. Можете ли вы обновить вопрос, чтобы другие могли помочь (не пытаясь сделать выбранный ответ более эффективным, гадая)? – Sam

+1

Итак, если мы говорим о ascii, просто создайте класс символов, который вы хотите. Btw, контрольные символы варьируются от 'x00-x1f' или' x7f', поэтому тесты для кодов 9 и 8 никогда не будут достигнуты, поскольку они являются частью управляющих кодов. – sln

+0

good one ... @sln – Garry

ответ

19

Забудьте пытаясь в черный список, просто это сделать, чтобы то, что вы хотите:

var pattern = /^[0-9.,]*$/; 

Edit: Кроме того, а не просто проверка цифр, запятых и точек. Я предполагаю, что-то вроде этого сделать даже больше, чем вы рассчитывали на:

var pattern = /^(0|[1-9][0-9]{0,2}(?:(,[0-9]{3})*|[0-9]*))(\.[0-9]+){0,1}$/; 

Demo

enter image description here

+0

'if (pattern.test (текст)) { \t \t \t console.log ('if'); \t \t \t return true; \t \t} else { \t \t \t console.log ('else'); \t \t \t return false; \t \t} 'Я использую код выше вместе с вашим шаблоном, но не работает – Garry

+1

Что означает« не работает »? Сообщения об ошибках? Какой вклад вы попытались и что вы ожидали от этого? – JJJ

+1

http://jsfiddle.net/YbWYp/2/ Я не вижу этого, позволяя этим – smerny

5

Так почему бы вам не попробовать /^[0-9,.]*$/ вместо отрицая тест?

0
^(?!.*[^0-9.,\n]).*$ 

Не уверен, что вы подразумеваете под эффективностью, но это не удается быстрее, хотя требуется длительное время, чтобы соответствовать правильной строке. См. Демонстрацию.

http://regex101.com/r/aK2zV7/1

0

Вы также можете просто использовать раствор из this answer:

parseFloat(text.replace(',','')); 
+0

Это заменит только первое вхождение ... так что «123,456,789.123» станет просто «123456». Поэтому, по крайней мере, вы хотели бы использовать 'replace (/,/g, '')' ... и поскольку OP пытается проверить и сделать что-то в зависимости от результата, а не конвертировать строку в число ... возможно, проверить на NaN? Но даже тогда parseFloat будет принуждать его к числу, пока он начинается таким образом («243 * # jfa32» станет 243). – smerny

1

Вы можете попробовать это:

/([0-9]+[.,]*)+/ 

Это согласующий номер с или withot комы или точками.

Смежные вопросы