在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
答案 0 :(得分:33)
您可以检查变量是否是这样的数字:$val -is [int]
这适用于数字值,但如果数字用引号括起来则不行:
1 -is [int]
True
"1" -is [int]
False
答案 1 :(得分:22)
像这样修改你的过滤器:
filter isNumeric {
[Helpers]::IsNumeric($_)
}
function
使用$input
变量来包含管道信息,而filter
使用包含当前管道对象的特殊变量$_
。
编辑:
对于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 :(得分:22)
如果您正在测试数字值的字符串,那么您可以使用正则表达式和-match
比较。否则Christian的回答是类型检查的一个很好的解决方案。
function Is-Numeric ($Value) {
return $Value -match "^[\d\.]+$"
}
Is-Numeric 1.23
True
Is-Numeric 123
True
Is-Numeric ""
False
Is-Numeric "asdf123"
False
答案 3 :(得分:12)
您可以执行以下操作:
$testvar -match '^[0-9]+$'
或
$testvar -match '^\d+$'
如果$ testvar是数字
,则返回“True”答案 4 :(得分:9)
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
答案 5 :(得分:8)
-is和-as运算符需要一个可以比较的类型。如果您不确定类型是什么,请尝试评估内容(部分类型列表):
(Invoke-Expression '1.5').GetType().Name -match 'byte|short|int32|long|sbyte|ushort|uint32|ulong|float|double|decimal'
好或坏,它也可以对十六进制值起作用(Invoke-Expression'0xA'...)
答案 6 :(得分:5)
如果要检查字符串是否具有数值,请使用以下代码:
$a = "44.4"
$b = "ad"
$rtn = ""
[double]::TryParse($a,[ref]$rtn)
[double]::TryParse($b,[ref]$rtn)
致谢here
答案 7 :(得分:2)
感谢所有为此主题做出贡献的人,并帮助我弄清楚如何测试数值。我想发布关于如何处理负数的结果,对于那些在搜索时也可能找到这个帖子的人来说......
注意:由于使用了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.]+$")
}
答案 8 :(得分:2)
我在使用read-host进行输入验证时遇到了这个主题。如果我尝试将变量的数据类型指定为read-host命令的一部分,并且用户输入了除该数据类型之外的其他内容,那么read-host将会出错。这就是我如何解决这个问题,并确保用户输入我想要的数据类型:
do
{
try
{
[int]$thing = read-host -prompt "Enter a number or else"
$GotANumber = $true
}
catch
{
$GotANumber = $false
}
}
until
($gotanumber)
答案 9 :(得分:1)
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]
答案 10 :(得分:1)
$itisint=$true
try{
[int]$vartotest
}catch{
"error converting to int"
$itisint=$false
}
这是更通用的,因为这样您就可以测试字符串(例如,从文件中读取)是否代表数字。如果您将“ 123”作为字符串包含在变量中,则其他使用-is [int]的解决方案将导致false。这也适用于Powershell低于5.1的计算机
答案 11 :(得分:0)
测试值是数字还是数值的字符串表示。
<?php
error_reporting(E_ALL);
require_once(functions . php);
$result = "true";
$DBH = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$STH = $DBH->prepare("INSERT INTO people ( username, permissions ) values (?, ?)");
if (isset($_POST["user"]) && isset($_POST["perm"])) {
$STH->bindParam(1, $_POST["user"], PDO::PARAM_STR);
$STH->bindParam(2, $_POST["perm"], PDO::PARAM_STR);
}
try {
$STH->execute();
} catch (PDOException $e) {
$result .= $e->getMessage;
}
echo json_encode($result);
?>
测试值是否为数值。
function Test-Number
{
Param
(
[Parameter(Mandatory=$true,
Position=0)]
[ValidatePattern("^[\d\.]+$")]
$Number
)
$Number -is [ValueType] -or [Double]::TryParse($Number,[ref]$null)
}
答案 12 :(得分:0)
每个数字类型都有其自己的值。请参见TypeCode枚举定义: https://docs.microsoft.com/en-us/dotnet/api/system.typecode?view=netframework-4.8 根据此信息,您所有的数字类型值都在5到15之间。 这意味着,您可以这样编写条件检查:
$typeValue = $x.getTypeCode().value__
if ($typeValue -ge 5 -and $typeValue -le 15) {"x has a numeric type!"}