2011-05-23 54 views
2

在F#中,我解析十進制字符串如何給的CultureInfo到的TryParse方法在F#

let foo str = 
    match Decimal.TryParse str with 
    | (true, result) -> Some result 
    | (false, _) -> None 

它使用當前系統的文化解析字符串。但我實際上想使用CultureInfo.InvariantCulture解析字符串。這可以用像上面那樣的模式匹配方式來完成嗎?如果不是,乾淨的方法是什麼?

回答

4

使用類似:

let foo str = 
    match System.Decimal.TryParse(str, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture) with 
    | (true, result) -> Some result 
    | (false, _) -> None 
+0

感謝巴斯的另一個重載。我沒有注意到中間的NumberStyles,導致我的編譯失敗。 – hwaien 2011-05-23 23:18:21

2

您需要使用超載,其中NumberStyles作爲第二個參數,CultureInfo作爲第三個參數。由於這是一個.NET方法,參數tupled(除了F#編譯器接通最後byref參數轉換爲一個返回typle):

let foo str = 
    match Decimal.TryParse(str, NumberStyles.None, CultureInfo.InvariantCulture) with 
    | (true, result) -> Some result 
    | (false, _) -> None 

(如在Visual Studio工具提示示出)的方法的類型簽名是:

Decimal.TryParse(一個或多個:串,樣式:的NumberStyles,提供商:的IFormatProvider,結果是:爲ByRef <十進制>):布爾

當使用帶圖案匹配方法編譯器會將參數列表末尾的所有byref參數轉換爲返回元組的(最後一個)元素,但它將參數保留爲元組,因此必須使用TryParse(foo, bar)表示法調用該方法。

0

使用TryParse方法

open System 
open System.Globalization 
let parse s = 
    match Decimal.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture) with 
    | true, v -> Some v 
    | false, _ -> None