2014-07-10 143 views
2

我想幾秒鐘的一定值轉換爲以下格式,使用F#:秒轉換以日,時,分,秒

00D 00H00米的00

而且我敢肯定,我做正確的鈣,但它也給了我錯誤的分鐘。我的代碼如下:

let sum = 266521 
let day = sum/86400 
let leftover = sum % 86400 

let hour = leftover/3600 
leftover = leftover % 3600 

let minute = leftover/60 
leftover = leftover % 60 

86400 -> Seconds in a day 
3600 -> Seconds in an hour 
60 -> Seconds in a minute. 

我試圖做到這一點貪婪的鈣,但它給我的價值觀: 3D小時122米7321s

但它不能是122米,應該是在一小時內。我不明白我的錯誤在哪裏。 你能幫我嗎? 在此先感謝

+2

注意編譯器警告。有問題的行產生'這個表達式應該有'單元'類型,但是類型爲'bool'。使用'ignore'放棄表達式的結果,或者'let'將結果綁定到名稱上。' – Daniel

回答

9

如何利用內置功能?

> open System;; 
> let secs = 266521;; 

val secs : int = 266521 

> let s = (TimeSpan.FromSeconds (float secs)).ToString "d\d\ hh\h\ mm\m\ ss\s";; 

val s : string = "3d 02h 02m 01s" 
+0

確實如此,但這個練習在具體的例子中用F#編碼指出微妙之處是值得的。 –

2

這是因爲F#中的值是不可變的(無法更改)。您的「剩餘」價值保持在7321的值,即第一個值。這樣做有助於線程和數據共享。任一改變的「剩餘」的值時,創建一個新的值或以其它方式使可變值:

let mutable leftover = sum % 86400 
leftover <- leftover % 3600 
0

leftover = leftover % 3600 

是一個布爾表達式,其比較leftoverleftover % 3600(這可能計算爲假)。你需要做的,是分配一個新值,

let leftover' = leftover % 3600 

然後用leftover'隨後。