В 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
Ответы
Ответ 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
является числом.
Ответ 5
PS> Add-Type -Assembly Microsoft.VisualBasic
PS> [Microsoft.VisualBasic.Information]::IsNumeric(1.5)
True
http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.information.isnumeric.aspx
Ответ 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]
}