Dans PowerShell, comment puis-je vérifier si une variable contient une valeur numérique?
Actuellement, j'essaie de le faire comme ça, mais ça semble toujours retourner 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
Modifiez votre filtre comme ceci:
filter isNumeric {
[Helpers]::IsNumeric($_)
}
function
utilise la variable $input
pour contenir des informations de pipeline, tandis que filter
utilise la variable spéciale $_
qui contient l'objet de pipeline en cours.
Modifier:
Pour une syntaxe PowerShell, vous pouvez utiliser uniquement un filtre (sans type-addition):
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]
}
Vous pouvez vérifier si la variable est un nombre comme celui-ci: $val -is [int]
Cela fonctionnera pour les valeurs numériques, mais pas si le nombre est placé entre guillemets:
1 -is [int]
True
"1" -is [int]
False
Si vous testez une chaîne pour une valeur numérique, vous pouvez utiliser l'expression régulière et la comparaison -match
. Sinon, la réponse de Christian est une bonne solution pour la vérification de type.
function Is-Numeric ($Value) {
return $Value -match "^[\d\.]+$"
}
Is-Numeric 1.23
True
Is-Numeric 123
True
Is-Numeric ""
False
Is-Numeric "asdf123"
False
Vous pouvez faire quelque chose comme:
$testvar -match '^[0-9]+$'
ou
$testvar -match '^\d+$'
Renvoie "True" si $ testvar est un nombre
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
Les opérateurs -is et -as ont besoin d'un type que vous pouvez comparer. Si vous n'êtes pas sûr du type, essayez d'évaluer le contenu (liste des types partiels):
(Invoke-Expression '1.5').GetType().Name -match 'byte|short|int32|long|sbyte|ushort|uint32|ulong|float|double|decimal'
Bon ou mauvais, cela peut aussi fonctionner avec les valeurs hexadécimales (Invoke-Expression '0xA' ...)
Si vous voulez vérifier si une chaîne a une valeur numérique, utilisez ce code:
$a = "44.4"
$b = "ad"
$rtn = ""
[double]::TryParse($a,[ref]$rtn)
[double]::TryParse($b,[ref]$rtn)
Crédits vont ici
J'ai rencontré ce sujet alors que je travaillais sur la validation des entrées avec read-Host. Si j'essayais de spécifier le type de données de la variable dans le cadre de la commande read-Host et que l'utilisateur saisissait autre chose que ce type de données, read-Host aurait une erreur. C’est ainsi que j’ai réussi à contourner ce problème et à faire en sorte que l’utilisateur entre le type de données que je voulais:
do
{
try
{
[int]$thing = read-Host -Prompt "Enter a number or else"
$GotANumber = $true
}
catch
{
$GotANumber = $false
}
}
until
($gotanumber)
Merci à tous ceux qui ont contribué à ce fil et m'ont aidé à comprendre comment tester les valeurs numériques. Je voulais poster mes résultats sur la façon de gérer les nombres négatifs, pour ceux qui peuvent également trouver ce fil lors d'une recherche ...
Remarque: Ma fonction nécessite la transmission d'une chaîne en raison de l'utilisation de 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.]+$")
}
Tester si une valeur est numérique ou une représentation sous forme de chaîne d'une valeur numérique.
function Test-Number
{
Param
(
[Parameter(Mandatory=$true,
Position=0)]
[ValidatePattern("^[\d\.]+$")]
$Number
)
$Number -is [ValueType] -or [Double]::TryParse($Number,[ref]$null)
}
Tester si une valeur est numérique.
function Test-Number
{
Param
(
[Parameter(Mandatory=$true,
Position=0)]
[ValidatePattern("^[\d\.]+$")]
$Number
)
$Number -is [ValueType]
}
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]