2016-07-15 1 views
3

У меня есть массив чисел в строчном формате (например, [| "1"; "2"; "3" ... |]) и вы хотите преобразовать их в удваивает, однако я хочу сделать это в CultureInvariant way. Конечно, я мог бы сделать:Более элегантный способ сделать 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 # double и float одно и то же, и оба они соответствуют a C# double. См. this answer.

Таким образом, вы можете просто использовать float оператор для этого, который обрабатывает переходы из многих типов, включая строки:

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

Операторы # преобразования F все толково использовать CultureInfo.InvariantCulture без необходимости указать его: См this function из исходного кода F #, используемого оператором float.

Если вы хотите использовать терминологию, совместимую с 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