Подтвердить что ты не робот

В PowerShell, как я могу проверить, имеет ли переменная числовое значение?

В PowerShell, как я могу проверить, содержит ли переменная числовое значение?

В настоящее время я пытаюсь сделать это так, но всегда возвращается false.

add-type -Language CSharpVersion3 @'
    public class Helpers {
        public static bool IsNumeric(object o) {
            return o is byte  || o is short  || o is int  || o is long
                || o is sbyte || o is ushort || o is uint || o is ulong
                || o is float || o is double || o is decimal
                ;
        }
    }
'@

filter isNumeric($InputObject) {
    [Helpers]::IsNumeric($InputObject)
}

PS> 1 | isNumeric
False
4b9b3361

Ответ 1

Измените свой фильтр следующим образом:

filter isNumeric {
    [Helpers]::IsNumeric($_)
}

function использует переменную $input, чтобы содержать информацию о конвейере, тогда как filter использует специальную переменную $_, которая содержит текущий объект конвейера.

Edit:

Для синтаксического режима powershell вы можете использовать только фильтр (без добавления):

filter isNumeric() {
    return $_ -is [byte]  -or $_ -is [int16]  -or $_ -is [int32]  -or $_ -is [int64]  `
       -or $_ -is [sbyte] -or $_ -is [uint16] -or $_ -is [uint32] -or $_ -is [uint64] `
       -or $_ -is [float] -or $_ -is [double] -or $_ -is [decimal]
}

Ответ 2

Вы можете проверить, является ли переменная числом следующим образом: $val -is [int]

Это будет работать с числовыми значениями, но если число не будет заключено в кавычки:

1 -is [int]
True
"1" -is [int]
False

Ответ 3

Если вы тестируете строку для числового значения, вы можете использовать регулярное выражение и сравнение -match. В противном случае христианский ответ является хорошим решением для проверки типов.

function Is-Numeric ($Value) {
    return $Value -match "^[\d\.]+$"
}

Is-Numeric 1.23
True
Is-Numeric 123
True
Is-Numeric ""
False
Is-Numeric "asdf123"
False

Ответ 4

Вы можете сделать что-то вроде:

$testvar -match '^[0-9]+$'

или

$testvar -match '^\d+$'

Возвращает True, если $testvar является числом.

Ответ 6

Операторы

-is и -as требуют типа, с которым вы можете сравнить. Если вы не знаете, какой тип может быть, попробуйте оценить содержимое (список неполного типа):

(Invoke-Expression '1.5').GetType().Name -match 'byte|short|int32|long|sbyte|ushort|uint32|ulong|float|double|decimal'

Хорошо или плохо, он может работать и с шестнадцатеричными значениями (Invoke-Expression '0xA'...)

Ответ 7

Если вы хотите проверить, имеет ли строка числовое значение, используйте этот код:

$a = "44.4"
$b = "ad"
$rtn = ""
[double]::TryParse($a,[ref]$rtn)
[double]::TryParse($b,[ref]$rtn)

Кредиты идут сюда

Ответ 8

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

Примечание. Моя функция требует передачи строки из-за использования Trim().

function IsNumeric($value) {
# This function will test if a string value is numeric
#
# Parameters::
#
#   $value   - String to test
#
   return ($($value.Trim()) -match "^[-]?[0-9.]+$")
}

Ответ 9

Я столкнулся с этой темой, работая над проверкой ввода с помощью read-host. Если я попытался указать тип данных для переменной как часть команды read-host, и пользователь введет нечто иное, чем этот тип данных, тогда для чтения-хоста будет ошибка. Именно так я обошел это и обеспечил, чтобы пользователь вводил тип данных, который я хотел:

do
    {
    try
        {
        [int]$thing = read-host -prompt "Enter a number or else"
        $GotANumber = $true
        }
    catch
        {
        $GotANumber = $false
        }
    }
until
    ($gotanumber)

Ответ 10

filter isNumeric {
    $_ -is [ValueType]
}

-

1 -is [ValueType]
True
"1" -is [ValueType]
False

-

function isNumeric ($Value) {
    return $Value -is [ValueType]
}

isNumeric 1.23
True
isNumeric 123
True
isNumeric ""
False
isNumeric "asdf123"
False

-

(Invoke-Expression '1.5') -is [ValueType]

Ответ 11

Тестирование, если значение является числовым или строковым представлением числового значения.

function Test-Number 
{
    Param
    (
        [Parameter(Mandatory=$true,
                   Position=0)]
        [ValidatePattern("^[\d\.]+$")]
        $Number
    )

    $Number -is [ValueType] -or [Double]::TryParse($Number,[ref]$null)
}

Тестирование, если значение является числовым.

function Test-Number 
{
    Param
    (
        [Parameter(Mandatory=$true,
                   Position=0)]
        [ValidatePattern("^[\d\.]+$")]
        $Number
    )

    $Number -is [ValueType]
}