2016-09-22 5 views
1

Quelqu'un peut me dire ce qui ne va pas avec ce code et l'expliquer?Chaîne d'entrée n'était pas dans un format correct en F #

open System 
let hexarea t:float = 
    (3.0*Math.Sqrt(3.0)/2.0) * Math.Pow(t, 2.0) 
let value = float (Console.ReadLine()) 
let calc = hexarea value 
printfn "%f" calc 

Je peux donner un indice, que quand il est comme

open System 
let hexarea t : float = 
    (3.0 * Math.Sqrt(3.0)/2.0) * Math.Pow(t,2.0) 
[<EntryPoint>] 
    let main argv = 
    let value = float (Console.ReadLine()) 
    let calc = hexarea value 
    printf "%f" calc 
    0 

Ensuite, il fonctionne.

S'il vous plaît clarifier à moi ce qui se passe et quel est le problème avec le premier code.

aussi, si je retire 0 de la dernière ligne, il se plaint ..

+2

[Votre code fonctionne très bien] (https://ideone.com/yjFcW1). Pour avoir besoin du 0, quand vous utilisez 'EntryPoint', la fonction à laquelle il s'applique doit retourner un' int'. – ildjarn

+0

Le code fonctionne très bien, pas besoin de . Lorsqu'un programme n'a pas d'attribut EntryPoint qui indique explicitement le point d'entrée, les liaisons de niveau supérieur du dernier fichier sont utilisées comme point d'entrée. –

+0

Mais si nous ne sommes pas sur le point de retourner quelque chose? quelle valeur devrais-je retourner? 0 semble avoir une signification conventionnelle de "OK Exécuté" .. mais comment c'est général? c'est une sorte de convention ou de règle obligatoire pour renvoyer 0? –

Répondre

2

Si vous obtenez exception « chaîne d'entrée était pas dans un format correct » comme le titre de votre question suggère, il est probable que le numéro que vous entrez dans le Console.ReadLine n'est pas au bon format.

Il s'agit d'un point de douleur continu si vous venez d'un pays qui utilise la virgule décimale plutôt que le point décimal. En tchèque, nous écrivons 3,14 et donc si vous définissez la culture actuelle à cs-CZ vous obtenez:

System.Threading.Thread.CurrentThread.CurrentCulture <- 
    System.Globalization.CultureInfo.GetCultureInfo("cs-CZ") 

float "1.0" // Works because this uses invariant culture 
System.Double.Parse("1.0") // Fails because this uses cs-CZ culture now 

float "1,0" // Fails because the invariant culture requires . 
System.Double.Parse("1,0") // Works according to cs-CZ culture