38

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
4

14 に答える 14

54

変数が次のような数値であるかどうかを確認できます。$val -is [int]

これは数値に対しては機能しますが、数値が引用符で囲まれている場合は機能しません。

1 -is [int]
True
"1" -is [int]
False
于 2012-06-07T08:16:40.123 に答える
32

文字列の数値をテストする場合は、正規表現と-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
于 2012-06-07T20:46:19.923 に答える
32

次のようにフィルターを変更します。

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

function$input変数を使用してパイプライン情報を格納しますが、 は現在のパイプライン オブジェクトを格納filterする特別な変数を使用します。$_

編集:

PowerShell 構文の場合、フィルターのみを使用できます (add-type なし):

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]
}
于 2012-06-07T08:20:18.680 に答える
29

次のようなことができます:

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

また

$testvar -match '^\d+$'

Trueが数値の場合に返します$testvar

于 2017-05-10T11:06:53.087 に答える
14

文字列に数値が含まれているかどうかを確認するには、次のコードを使用します。

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

クレジットはこちら

于 2014-12-09T10:17:49.593 に答える
11
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

于 2012-06-07T16:20:44.203 に答える
10

-is および -as 演算子には、比較できる型が必要です。タイプが何であるかわからない場合は、コンテンツを評価してみてください (部分的なタイプ リスト)。

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

良くも悪くも、16 進値に対しても機能します (Invoke-Expression '0xA' ...)

于 2012-06-07T08:46:49.853 に答える
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.]+$")
}
于 2013-01-10T20:55:58.720 に答える
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)
于 2017-01-06T18:42:07.500 に答える