web-dev-qa-db-fra.com

Dans PowerShell, comment puis-je vérifier si une variable contient une valeur numérique?

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
22
Damian Powell

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]
}
22
CB.

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
32
tophatsteve

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
20
joshuapoehls

Vous pouvez faire quelque chose comme:

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

ou

$testvar -match '^\d+$'

Renvoie "True" si $ testvar est un nombre

10
Matt
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

9
x0n

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' ...)

9
Shay Levy

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

4
tsap

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)
2
James

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.]+$")
}
2
edwdecarlo

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]
}
0
Vince Ypma
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]
0
Aaron