草庐IT

ios - Swift 3 十进制、NSDecimal 和 NSDecimalNumber

coder 2023-07-14 原文

我正在尝试将 NumberFormatter 与 Swift 3 Decimal 一起使用,但我对 Decimal 的实际实现方式感到困惑。我遇到的问题是 Decimal 是一个结构,所以每次我想使用格式化程序时,我都必须将它桥接到 NSDecimalNumber避免。

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let decimal = Decimal(integerLiteral: 3)
let string = formatter.string(from: decimal as NSDecimalNumber)

这是实现我自己的采用 Decimal 的扩展的理想解决方法吗?

extension NumberFormatter {
    open func string(from number: Decimal) -> String? {
        return string(from: number as NSDecimalNumber)
    }
}

更一般地说,每次我需要传入一个对象类型时,我是否需要桥接 Decimal 或编写更多扩展?

编辑

我想我更普遍地想知道 Swift 3 中的 NSDecimal DecimalNSDecimalNumber。我完全不清楚发生了什么在这。对于 Swift 3,我应该用 Decimal 替换 NSDecimalNumber 吗?文档写道:

The Swift overlay to the Foundation framework provides the Decimal structure, which bridges to the NSDecimalNumber class. The Decimal value type offers the same functionality as the NSDecimalNumber reference type, and the two can be used interchangeably in Swift code that interacts with Objective-C APIs. This behavior is similar to how Swift bridges standard string, numeric, and collection types to their corresponding Foundation classes.

起初我认为 Decimal 是新的 NSDecimalNumber 就像 Error 是新的 NSError -但现在我不太确定。这还说“十进制值类型提供与 NSDecimalNumber 引用类型相同的功能”——这是真的吗?我似乎无法获得很多相同的功能(当然,如果不首先桥接它,这是他们的意思吗?)。我在这里和那里找到了一些帖子和一些信息,但没有什么令人信服的。有没有人有任何知识或见解?

我的应用专门使用 NSDecimalNumber 进行货币和格式设置,因此舍入和格式设置具有高优先级。

最佳答案

我在 swift-users 板上提出了我的问题并得到了很好的答案,请在此处查看:https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20161219/004220.html

回复的文本版本:

Swift 3 引入了 Decimal 类,起初我认为它应该在 Swift 中“替换”NSDecimalNumber,就像 Error 是新的 NSError 等。但是,经过进一步调查,我不清楚这其实是这样的。看起来 Swift 3 的 Decimal 更像是一个 NSDecimal,但有一些桥接,因此它可以在需要时使用 NSDecimalNumber 的方法。我想知道的是,我是否应该将应用程序中的 NSDecimalNumber 替换为 Decimal? Decimal 是 Swift 中 NSDecimalNumber 的继承者吗?

Decimal 实际上是一个结构,而不是一个类,实际上它只是 Objective-C 中 NSDecimal 结构的 Swift 名称。在 Swift 中,NSDecimalAdd 等函数作为 Decimal 上的运算符公开,用于满足各种数字协议(protocol)(如 SignedNumber)的要求。

最终结果是 Decimal 很像 IntDouble——它是一种值类型,可以很方便地用来做所有事情各种数学。 NSDecimalNumber 等同于 NSNumber

由于我的应用程序进行了大量格式化,因此需要在 Decimal 和 NSDecimalNumber 之间进行大量转换,或者添加要使用的扩展,因此我认为如果没有很多扩展,这将不会自然/方便。 Swift 是否计划改进 Decimal 以更适用于 NumberFormatter 或其他面向对象的数字 API?希望我已经提供了足够的信息来回答我的问题。

使用 NSDecimalNumber 的 Objective-C API 应该桥接到 Decimal,就像 NSString 桥接到 String。但是,桥接可能不适用于类别方法;您可以通过在 Decimal 上编写扩展将它们公开给 Swift,该扩展将 self 转换为 NSDecimalNumber,然后调用您的 Objective-C 方法。

同样,您应该能够通过转换为 NSDecimalNumber 来将 DecimalNumberFormatter 一起使用,就像您转换为 IntDoubleNSNumber 以将它们与 NumberFormatter 一起使用。

关于ios - Swift 3 十进制、NSDecimal 和 NSDecimalNumber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41148782/

有关ios - Swift 3 十进制、NSDecimal 和 NSDecimalNumber的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  4. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby - 如何在 Ruby 中将负整数转换为二进制 - 2

    问题1:我无法通过以下方式找到将负整数转换为二进制的方法。我应该像这样转换它。-3=>"11111111111111111111111111111101"我在下面试过:sprintf('%b',-3)=>"..101"#..appearsanddoesnotshow111111bit.-3.to_s(2)=>"-11"#Thisjustadds-tothebinaryofthepositiveinteger3.问题2:有趣的是,如果我使用在线转换器,它告诉我-3的二进制是“0010110100110011”。"11111111111111111111111111111101"和"001

  8. Ruby#index 方法 VS 二进制搜索 - 2

    给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题:

  9. ruby - 如何在 Ruby 中返回整数的固定长度二进制表示? - 2

    我知道我可以使用Fixnum#to_s将整数表示为二进制格式的字符串。但是1.to_s(2)生成1而我希望它生成00000001。我怎样才能使所有返回的字符串都以零作为填充到8个字符?我可以使用类似的东西:binary="#{'0'*(8-(1.to_s(2)).size)}#{1.to_s(2)}"if(1.to_s(2)).size但这看起来不是很优雅。 最佳答案 使用字符串格式。"%08b"%1#=>"00000001" 关于ruby-如何在Ruby中返回整数的固定长度二进制表示?

  10. ruby - 在 Ruby 中将字符串转换为十六进制 - 2

    我正在尝试使用Ruby将二进制文件转换为十六进制。目前我有以下内容:File.open(out_name,'w')do|f|f.puts"constunsignedintmodFileSize=#{data.length};"f.puts"constcharmodFile[]={"first_line=truedata.bytes.each_slice(15)do|a|line=a.map{|b|",#{b}"}.joiniffirst_linef.putsline[1..-1]elsef.putslineendfirst_line=falseendf.puts"};"end这是以下代

随机推荐