Не удалось разобрать (?) Десятичные дроби с помощью FSharpValue.MakeRecord ТОЛЬКО на устройстве iOS с регионом Испанский / Колумбия - PullRequest
0 голосов
/ 01 марта 2019

Эта ошибка не произошла на Android, эмуляторе IOS, OSX, Linux.Только на устройстве iOS, когда у него есть область, отличная от US / English.

Я использую отражение для декодирования значений Json, и именно в FSharpValue.MakeRecord искажаются данные десятичных дробей.

Шаги воспроизведения
  1. Создайте приложение Single View для iOS и заполните его:
namespace test
open System
open UIKit
open Foundation
open Microsoft.FSharp.Reflection

type DocumentRow = {
    doc_id:int32
    doc_kind:string
    doc_code:string
    customer_code:string
    from_code:string option
    username:string
    createdat:DateTime
    updatedat:DateTime
    dueat:DateTime option
    signature:string option
    authorized:string option
    delivery_order:int32
    price:decimal
    cost:decimal
    tax_value:decimal
    discount_value:decimal
    sub_total:decimal
    total:decimal
    status:string
    notes:string option
    syncdata:string option
    version:int32
}

module JSON =
    let fromJSON ty (fields:Reflection.PropertyInfo array) (objs:Map<string, obj>) =
        //printfn "%A" objs
        let values = fields |> Array.map(fun f ->
            let name = f.Name.ToLower()
            if objs.ContainsKey(name) then
                let value = objs.[name] 
                value
            else
                null
        )
        printfn "%A" values
        FSharpValue.MakeRecord(ty, values)

[<Register ("AppDelegate")>]
type AppDelegate () =
    inherit UIApplicationDelegate ()
    override val Window = null with get, set
    override this.FinishedLaunching (app, options) =
        let t = typedefof<DocumentRow>
        let fields = FSharpType.GetRecordFields t

        let data = [
            "doc_id", 1|> box
            "doc_kind", "O"|> box
            "doc_code", "ORD-3-1"|> box
            "customer_code", "70084254_32"|> box
            "from_code", null
            "username", "admin"|> box
            "createdat", DateTime.Now |> box
            "updatedat", DateTime.Now |> box
            "dueat", null
            "signature", null
            "authorized", null
            "delivery_order", 0|> box
            "price", 700M|> box
            "cost", 0M|> box
            "tax_value", 0M|> box
            "discount_value", 0M|> box
            "sub_total", 3500M|> box
            "total", 3500M|> box
            "status", "Draft"|> box
            "notes", null
            "syncdata", null
            "version", null
        ]
        let ob = Map.ofList data
        let r = JSON.fromJSON t fields ob :?> DocumentRow
        printfn "Result = %A" r
        true

Запустите на эмуляторе, он напечатает в окнах вывода:
{doc_id = 1;
 doc_kind = "O";
 doc_code = "ORD-3-1";
 customer_code = "70084254_32";
 from_code = None;
 username = "admin";
 createdat = 28/02/2019 6:05:13 p. m.;
 updatedat = 28/02/2019 6:05:13 p. m.;
 dueat = None;
 signature = None;
 authorized = None;
 delivery_order = 0;
 price = 700M;
 cost = 0M;
 tax_value = 0M;
 discount_value = 0M;
 sub_total = 3500M;
 total = 3500M;
 status = "Draft";
 notes = None;
 syncdata = None;
 version = 0;}

это правильно.

Запуск на устройстве iOS.Я использую iPhone 6 se, но воспроизводим во многих других.

Он печатает:

{doc_id = 1;
 doc_kind = "O";
 doc_code = "ORD-3-1";
 customer_code = "70084254_32";
 from_code = None;
 username = "admin";
 createdat = 28/02/2019 6:04:12 p. m.;
 updatedat = 28/02/2019 6:04:12 p. m.;
 dueat = None;
 signature = None;
 authorized = None;
 delivery_order = 0;
 price = 12912720851596686131200M;
 cost = 0M;
 tax_value = 0M;
 discount_value = 0M;
 sub_total = 64563604257983430656000M;
 total = 64564290437145643974656M;
 status = "Draft";
 notes = None;
 syncdata = None;
 version = 0;}

Посмотрите, как искажаются все десятичные значения.

Информация, связанная с данной

iOS 12.1.4 Visual Studio Community 2017 для Mac Mono 5.16.0.221 (2018-06 / b63e5378e38) (64-разрядная версия)

PD: сообщается в https://github.com/fsharp/fsharp/issues/893

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...