如何在F#中将CultureInfo赋予TryParse方法

时间:2011-05-23 22:56:40

标签: f#

在F#中,我用

解析十进制字符串
let foo str =
    match Decimal.TryParse str with
    | (true, result) -> Some result
    | (false, _) -> None

使用当前系统文化来解析字符串。但实际上我想使用CultureInfo.InvariantCulture来解析字符串。这可以用上面的模式匹配方式完成吗?如果没有,最简洁的方法是什么?

3 个答案:

答案 0 :(得分:4)

使用类似:

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

答案 1 :(得分: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(s:string,style:NumberStyles,provider:IFormatProvider,result:byref< decimal>):bool

当使用带模式匹配的方法时,编译器将所有byref参数从参数列表的末尾转换为返回元组的(最后)元素,但它将参数保留为元组,因此您有使用TryParse(foo, bar)表示法调用该方法。

答案 2 :(得分: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