0
votes

Comment lancer une valeur de chaîne à son type correct

J'ai une fonction FOO que je veux transmettre une liste d'arguments dans ce format: xxx

J'ai besoin de savoir si la valeur après chaque = = est un int , string ou double (float) .

Voici mon code: xxx

Cependant, la valeur est toujours une chaîne, ce qui a du sens puisqu'il est lu depuis une chaîne.

Puis-je la jeter en quelque sorte au bon type?

Je sais que je pourrais faire quelque chose comme ça, mais ce n'est pas fiable depuis par exemple, par exemple 1 peut être tout xxx


0 commentaires

4 Réponses :


0
votes

Vous pouvez tester des types limités en utilisant -As code> comme celui-ci -

$val = '23.00' #input value to be type-casted

$intVal = $val -as [int]
$floatVal = $val -as [float]

if ($null -ne $floatVal -and $intVal -ne $floatVal) {
$val = $floatVal # value is float type
} elseif ($null -ne $intVal) {
$val = $intVal # value is int type
} else {
Write-output '$val is already string type' # value is not float or int, so use it as string
}


0 commentaires

0
votes

Je viens d'ajouter des instructions avec le type de coulée de type sur votre fonction.

Function foo {

    Param(
        [ValidateScript({ $_ -match ".*=.*" })]    
        [string[]]$ArgumentList
    )

    foreach ($Par in $ArgumentList) {

        $Split = $Par -split "="
        $ParamName = $Split[0]
        $ParamValue = $Split[1]

        if($ParamName -eq "a"){
            $ParamValue = [int]$ParamValue
        }

        if($ParamName -eq "b"){
            $ParamValue = [string]$ParamValue
        }

        if($ParamName -eq "c"){
            $ParamValue = [double]$ParamValue
        }



        if ($ParamValue -is [string]) {
            "2049" + $ParamName + $ParamValue
        } 
        elseif ($ParamValue -is [int]) {
            "2050" + $ParamName + $ParamValue
        } 
        elseif ($ParamValue -is [double]) {
            "2051" + $ParamName + $ParamValue
        } 
        else {
            Write-Host "Not a string, int or float."
        }
    } 
}


1 commentaires

merci mais les noms paramètres sont juste des exemples, je ne connais pas leurs noms à l'avenir, donc je ne peux donc pas utiliser ceci



0
votes

Comme vous l'avez reconnu, vous définissez le type de chaîne lorsque vous passez la valeur à votre paramètre, il doit toujours évaluer en tant que chaîne.

Si vous définissez votre paramètre sous forme de tableau que votre fonction pourrait fonctionner. Exemple ci-dessous, Get-Member affiche les types d'objets dans la matrice.

Comment obtenez-vous la valeur de votre paramètre? Il peut être préférable de changer le format avant de le transmettre à votre fonction. xxx


0 commentaires

1
votes

J'utiliserais simplement le type Tryparse (String, [Ref] Var) Méthode. XXX

J'ai ajouté $ Paramvalue.gettype () .FullName pour que vous puissiez voir le type étant défini. Le [TYPE] :: Tryparse (chaîne, [réfr] $ TEMP) La méthode tentera de lancer la chaîne sur le type. Il retournera true ou false et stocke la valeur correspondante dans $ TEMP . false donnera une valeur 0 dans $ TEMP dans nos étuis de test. Si true , $ TEMP contiendra la valeur coulée.

Note: Vous devez réaliser que dès que vous introduisez. Concaténation de chaîne ( "2048" + quelqueévalue ) que la sortie de cette expression est une chaîne .


1 commentaires

Cela fonctionne parfaitement. Merci! Je sais que cela deviendra une corde à la fin, il doit juste être une chaîne avec le numéro correct devant :-).