2016-07-15 53 views
3

我有一個字符串格式的數字數組(例如[|「1」;「2」;「3」... |]),並且想將它們轉換爲雙打,但是我想用CultureInvariant的方式來做。當然,我可以這樣做:更優雅的做法CultureInvariant Double.parse F#

[|"1"; "2"|] |> Array.map (fun (a) -> Double.Parse(a, CultureInfo.InvariantCulture)) 

但是,有沒有辦法做到這一點是這樣的:

[|"1"; "2"|] |> Array.map Double.Parse 

,但CultureInfo.InvariantCulture?這段代碼看起來更可讀。換句話說,是否有任何方法將CultureInfo.InvariantCulture傳遞給Double.parse,或者爲所有程序/腳本全局設置CultureInfo.InvariantCulture。

回答

4

在F#doublefloat是相同的東西,它們都對應於一個C#double。請參閱this answer

因此,你可以簡單地使用float運營商對於這一點,其處理來自多種類型包括字符串轉換:

[|"1"; "2"|] |> Array.map float 

的F#轉換運營商的所有合理使用CultureInfo.InvariantCulture,而不需要您指定它:參見this function來自float運營商使用的F#源代碼。

如果您想使用C#兼容術語,則可以使用double運算符,該運算符只是float的別名。

如果您需要32位浮點數(C#浮點數),則可以使用float32

3

非常簡單,以限定一個輔助函數,並使用該:

let ParseInvariant a = Double.Parse(a, CultureInfo.InvariantCulture) 
let b = [|"1"; "2"|] |> Array.map ParseInvariant 

或定義一個擴展方法:

type Double with 
    static member ParseInvariant a = Double.Parse(a, CultureInfo.InvariantCulture) 
let b = [|"1"; "2"|] |> Array.map Double.ParseInvariant 
+1

沒有想過延長方法,謝謝! – Darkkey

+0

我們通常將這些引用爲F#中的擴展成員,因爲它們不限於方法:) – smoothdeveloper