2016-09-22 2 views
1

Кто-нибудь может сказать мне, что не так с этим кодом и объяснить это?Строка ввода не была в правильном формате в 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 

Я могу дать подсказку, что, когда это как

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 

Затем он работает.

Просьба пояснить, что происходит, и в чем проблема с первым кодом.

также, если удалить 0 из последней строки, он жалуется ..

+2

[Ваш код работает отлично] (https://ideone.com/yjFcW1). Что касается необходимости 0, когда вы используете 'EntryPoint', то функция, к которой она применяется, должна возвращать' int'. – ildjarn

+0

Код работает нормально, не нужно . Когда у программы нет атрибута EntryPoint, который явно указывает точку входа, в качестве точки входа используются привязки верхнего уровня в последнем файле. –

+0

Но если мы не собираемся что-то возвращать? какую ценность я должен вернуть? 0, похоже, имеет обычное значение «OK Executed» .. но насколько оно вообще? это всего лишь условное или обязательное правило для возврата 0? –

ответ

2

Если вы получаете «Строка ввода не был в правильном формате» исключение в качестве названия вашего вопроса предполагает, что это, вероятно, потому, что номер, который вы вводите в Console.ReadLine, находится не в правильном формате.

Это непрерывная точка боли, если вы из страны, которая использует десятичную запятую, а не десятичную точку. В Чехии мы пишем 3,14 и поэтому, если вы установите текущую культуру cs-CZ вы получите:

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 
Смежные вопросы