Ios 我应该在maximumFractionDigits中设置什么以最小化数据丢失? 介绍
我注意到Ios 我应该在maximumFractionDigits中设置什么以最小化数据丢失? 介绍,ios,swift,formatting,Ios,Swift,Formatting,我注意到NumberFormatter#maximumFractionDigits默认值为3 我已证实: import Foundation let nf = NumberFormatter() nf.numberStyle = .decimal print(nf.maximumFractionDigits) //=> 3 nf.string(for: Decimal(string: "100.1111111")) //=> "100.111" 我已尝试设置Int.max 我将I
NumberFormatter#maximumFractionDigits
默认值为3
我已证实:
import Foundation
let nf = NumberFormatter()
nf.numberStyle = .decimal
print(nf.maximumFractionDigits) //=> 3
nf.string(for: Decimal(string: "100.1111111")) //=> "100.111"
我已尝试设置Int.max
我将Int.max
设置为maximumFractionDigits
:
import Foundation
let nf = NumberFormatter()
nf.numberStyle = .decimal
nf.maximumFractionDigits = Int.max
nf.string(for: Decimal(string: "100.1111111")) // => "100"
为什么!?成为“100”
在我的研究中
我读了Foundation>NSNumberFormatter>NumberFormatter
源代码:
开放变量最大分数位数:Int
我已确认maximumFractionDigits
数据类型为Int
问题:
如何将最大值设置为maximumFractionDigits
我希望尽可能不丢失地显示服务器响应。
当然,服务器响应是json
中的String
。但在ios应用程序中,大多数计算都是从字符串中使用十进制
。因此,这个目标是将UILabel
的Decimal
转换为String
- 问题1<代码>nf.maximumFractionDigits=Int.max
。为什么要丢失数据?这是NumberFormatter
上的错误
问题2。如何将最大值设置为maximumFractionDigits
正确
目标
我希望将数据丢失降至最低。Q1。nf.maximumFractionDigits=Int.max。为什么要丢失数据?这是NumberFormatter上的错误?
如果没有明确的文档记录,每个Int
参数可能都有限制,具体取决于实现细节。如果传递的值超过此限制,则运行时错误可能会导致崩溃,或者可能会被静默忽略,所有这些都取决于实现细节
据我测试,您可以设置为maximumFractionDigits
的最大数字与Int32.max
的值相同
let nf = NumberFormatter()
nf.numberStyle = .decimal
nf.maximumFractionDigits = Int(Int32.max)+1
print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
//->123
nf.maximumFractionDigits = Int(Int32.max)
print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
//->123.45678901234567890123456789012345678
您可以称之为bug,但是,NumberFormatter
可以处理的最大有效位是38位,即十进制数。谁想对比预期实际价值大数百万倍的价值做出精确定义
Q2。如何将max设置为maximumFractionDigits正确?
如上所述,十进制
中的有效数字为38。你可以这样写:
let nf = NumberFormatter()
nf.numberStyle = .decimal
nf.usesSignificantDigits = true
nf.maximumSignificantDigits = 38
print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
//->123.45678901234567890123456789012345678
Q1。nf.maximumFractionDigits=Int.max。为什么要丢失数据?这是NumberFormatter上的错误?
如果没有明确的文档记录,每个Int
参数可能都有限制,具体取决于实现细节。如果传递的值超过此限制,则运行时错误可能会导致崩溃,或者可能会被静默忽略,所有这些都取决于实现细节
据我测试,您可以设置为maximumFractionDigits
的最大数字与Int32.max
的值相同
let nf = NumberFormatter()
nf.numberStyle = .decimal
nf.maximumFractionDigits = Int(Int32.max)+1
print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
//->123
nf.maximumFractionDigits = Int(Int32.max)
print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
//->123.45678901234567890123456789012345678
您可以称之为bug,但是,NumberFormatter
可以处理的最大有效位是38位,即十进制数。谁想对比预期实际价值大数百万倍的价值做出精确定义
Q2。如何将max设置为maximumFractionDigits正确?
如上所述,十进制
中的有效数字为38。你可以这样写:
let nf = NumberFormatter()
nf.numberStyle = .decimal
nf.usesSignificantDigits = true
nf.maximumSignificantDigits = 38
print(nf.string(for: Decimal(string: "123.45678901234567890123456789012345678"))!)
//->123.45678901234567890123456789012345678
你希望发生什么?您正在尝试将9223372036854775807个小数位数添加到string@Dabus我想补充一点。@shingo.nakanishi什么用例需要这个?你的目标是什么?将数字转换为字符串时需要什么结果?您正在将一个字符串转换为另一个字符串。你说你不想失去。那么,为什么还要为任何转换而烦恼呢?@rmaddy我添加了目标。你希望发生什么?您正在尝试将9223372036854775807个小数位数添加到string@Dabus我想补充一点。@shingo.nakanishi什么用例需要这个?你的目标是什么?将数字转换为字符串时需要什么结果?您正在将一个字符串转换为另一个字符串。你说你不想失去。那么,为什么还要费心转换呢?@rmaddy我添加了目标。我真的很喜欢你的解释。我需要它正常工作,所以我深入研究了一下,发现到今天为止,运行Xcode 12,Swift 5.3,极限似乎是36个小数点。然而,非常有趣的是,如果创建一个十进制(字符串:“”,它会将前36位截断为36位。同样有趣的是,如果设置maximumSignificantDigits=36,它不会占用36位,而是会占用更少的数字。因此,我设置了Int(Int.max)
在该字段中,我知道我将获得36位精度。我真的很喜欢你的解释。我需要它正常工作,所以我深入研究了一下,发现到今天为止,运行Xcode 12,Swift 5.3时,限制似乎是36个小数点。然而,有趣的是,如果你创建一个小数点(字符串:“,它将前36位数字截断为36位。同样有趣的是,如果设置maximumSignificantDigits=36,它不会占用36位数字,但会占用更少的数字。因此,我在该字段中设置了Int(Int.max)
,并且知道我将获得高达36位的精度。