Эта ошибка не произошла на Android, эмуляторе IOS, OSX, Linux.Только на устройстве iOS, когда у него есть область, отличная от US / English.
Я использую отражение для декодирования значений Json, и именно в FSharpValue.MakeRecord искажаются данные десятичных дробей.
Шаги воспроизведения
- Создайте приложение 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