2013-10-02 38 views
2

如何用單位打印出數字?我應該使用「%A」還是應該先剝離單元? MSDN沒有說什麼:http://msdn.microsoft.com/en-us/library/vstudio/ee370560.aspxF#中的單位是數字(值)的格式佔位符是什麼?

[<Measure>] type hr 
let a = 10<hr> 

printf "%d" a // <-- doesn't compile: Unit of measure 'hr' doesn't match the unit of measure '1' 
+0

可能重複[如何在F#中使用度量單位打印生成的單位?](http://stackoverflow.com/questions/4359767/how-do-you-print-the-resulting-units-using -un-of-measure-in-f) –

+1

我不同意這是重複的。另一個問題是如何打印出計量單位的實際單位部分。這是關於讓任何東西打印出來。 –

回答

3

如果你想強類型爲您hr計量單位你可以使用「%一個」。

printf "%a"需要一個函數,其中第一個參數是TextWriter,第二個參數是您指定的任何值。使用這將允許您要求int<hr>作爲第二個參數,它將在編譯時提供類型檢查。

看一看下面的代碼:

open System.IO 

[<Measure>] type hr 

let printHours (tw:TextWriter) (hours:int<hr>) = 
    tw.Write("{0} hour(s)", hours) 

在你的問題的例子可以寫成:

let a = 10<hr> 
printf "%a" printHours a 

這將打印10小時(S)到控制檯。

如果您在不具有hr單元的值傳遞,你會得到一個可愛的錯誤:

printf "%a" printHours 10;; 

printf "%a" printHours 10;; 
-----------------------^^ 

error FS0001: This expression was expected to have type 
    int<hr>  
but here has type 
    int  
+0

甜美!謝謝 –

2

我可能會做任何printf "%O hour(s)" a否則int a |> printf "%i hour(s)"。一個是類型安全的,一個是短的。

相關問題