2010-09-27 2 views
3

Можно создать дубликат:
How do I tell if a variable has a numeric value in Perl?Как определить, является ли переменная числовой в Perl?

Я хочу, чтобы решить, является ли переменная (значение разобран из строки) является числом или нет. Как я могу это сделать? Ну, я думаю, /^[0-9]+$/ будет работать, но есть ли более элегантная версия?

ответ

19
if (/\D/)   { print "has nondigits\n" } 
if (/^\d+$/)   { print "is a whole number\n" } 
if (/^-?\d+$/)  { print "is an integer\n" } 
if (/^[+-]?\d+$/) { print "is a +/- integer\n" } 
if (/^-?\d+\.?\d*$/) { print "is a real number\n" } 
if (/^-?(?:\d+(?:\.\d*)?&\.\d+)$/) { print "is a decimal number\n" } 
if (/^([+-]?)(?=\d&\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/) 
        { print "a C float\n" } 

взято отсюда: http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Perl

+2

Если вы настаиваете на регулярное выражение, получить его от Regexp :: Common :) –

+1

И каждый из этих регулярных выражений, используемых в $ анкер позволяет новой строки в конце стоимость. Это ошибка в perlfaq4 (теперь я исправил документы, чтобы удалить эту ошибку), где появился пример Rosetta Code. Этот пример, однако, заключался в том, чтобы определить, какое это число, а не то, что это какой-то номер. –

+0

Пожалуйста, исправьте меня, если я ошибаюсь, но мне кажется, что в конкретном случае проверки строго цифр (т. Е. Подмножества числовых, поскольку число может иметь десятичную точку и, возможно, отрицательный знак или даже положительный знак , а также запятые или какой-либо другой визуальный групповой символ, используемый для группировки символов в тройках для визуального чтения), тогда «/ \ D /» есть - где существуют строки, которые терпят неудачу только для теста с цифрами - всегда более эффективны, чем «/^\ d + $/", потому что"/\ D/"истинно при сканировании первого нецифрового символа. –

6

с использованием регулярных выражений, его хорошо использовать:

if ($var =~ /^\d+?$/) { 
    // integer 
} 

В качестве альтернативы, вы можете использовать POSIX.

use POSIX; 

if (isdigit($var)) { 
    // integer 
} 
+0

Это просто цифры. Он пропускает литералы, которые являются числами, которые имеют больше, чем просто цифры. –

+0

Является ли POSIX частью ядра perl? – 719016

+0

Видимо, да. –

24

Вы можете использовать функцию looks_like_number() из основных Scalar::Util модуля.
Смотрите также вопрос perlfaq: How do I determine whether a scalar is a number/whole/integer/float?

+2

Это, вероятно, самый правильный ответ, так как 'Scalar :: Util' перехватывает API Perl, чтобы на самом деле спросить Perl, думает ли он, что переменная выглядит числовой. Таким образом, для общей задачи избегать «числовых» предупреждений это всегда будет работать. Конечно, иногда лучше просто сказать «no warnings» numeric »,' ... –

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