在 Swift 中使用 NumberFormatter 格式化大十进制数

2023-11-24

我这样做是为了格式化数字,但对于大数字来说失败

let formatter = NumberFormatter()
formatter.numberStyle = .decimal


    if let number = formatter.number(from: "123456789123456789123") , let str = formatter.string(from:number){

        print(number)
        print(str)
    }

它打印

123456789123456800000
123,456,789,123,456,800,000

它应该打印

123456789123456789123
123,456,789,123,456,789,123

我认为应该存在数字溢出,有没有其他方法可以实现这种事情。


这个问题的根源有三个方面:

  • 从版本 5.6 开始,Swift 不支持十进制文字。
  • Decimal() 支持最多 38 位精度。
  • Double() 支持大约 17 位精度。

因此,当使用 Decimals 表示精度超过 17 位的数字时,切勿执行任何将 Decimal 值转换为 Double 的操作,这一点至关重要。这包括用文字初始化:

print (Decimal(1234567890.12345678901234567890)) 
// 1234567890.1234569216
print (Decimal(string: "1234567890.12345678901234567890")!) 
// 1234567890.12345678901234567890

Decimal(1234567890.12345678901234567890) 生成值 1234567890.1234569216,因为 1234567890.12345678901234567890 是 Double 文字,精度限制为大约 17 位。

遗憾的是,NumberFormatter 显然从未收到有关此问题的备忘录。

var dec = Decimal(string: "1234567890.12345678901234567890")!
let f = NumberFormatter()
f.numberStyle = .decimal
f.minimumFractionDigits = 20
print (f.string(from: dec as NSDecimalNumber)!) // 1,234,567,890.12346000000000000000

因此,目前还没有办法让 Swift 准确地生成精度超过 17 位的本地化十进制数字。例如,NumberFormatter 无法生成字符串 1,234,567,890.12345678901234567890,即使 Decimal 可以表示该精确值。

您可以使用 String(describing:) 获取小数的非本地化字符串表示形式

print (String(describing:(Decimal(string: "1234567890.12345678901234567890")!)))
// 1234567890.1234567890123456789

对于我自己的一个应用程序,我制作了一个小小的“穷人”十进制格式化程序,它只是使用所需区域设置中的小数分隔符输出完整值:

let locale = Locale(identifier: "fr_FR")
dec = Decimal(string: "1234567890,12345678901234567890", locale: locale)!

let formatter = NumberFormatter()
formatter.locale = locale
let localizedSeparator = String(formatter.decimalSeparator.first ?? ".")

let fractionDigits = 20
var strings = String(describing:(dec)).split(separator: (Locale.current.decimalSeparator?.first) ?? "." )
var result = strings[0]
if fractionDigits > 0 {
    if strings.count > 1 {
        while strings[1].count < fractionDigits { strings[1] += "0" }
        result += localizedSeparator + String(strings[1].prefix(fractionDigits))
    }
    else {
        result += localizedSeparator + (0..<fractionDigits).map{_ in "0"}
    }
}

print (result) // 1234567890,12345678901234567890
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中使用 NumberFormatter 格式化大十进制数 的相关文章

随机推荐

  • 可以在 PHP 中动态创建实例属性吗?

    有没有办法动态创建所有实例属性 例如 我希望能够在构造函数中生成所有属性 并且在类实例化后仍然能够访问它们 如下所示 object gt property 请注意 我想单独访问属性 而不是使用数组 这是我的一个例子don t want cl
  • 简单的正则表达式替换以保留原始字符串

    我有这个 Title Regex Replace Title s span style background none s span RegexOptions IgnoreCase Where s是一个像这样的词facebook 如果标题是
  • Symfony2 - 运行时动态 Doctrine 数据库连接

    我正在寻找一个很好的解决方案 利用 Doctrine 进行实体管理 在 Symfony 中动态连接数据库 我遇到的情况是 我们服务的所有入站用户都将访问 website com 地址 例如 client1 website com 我们希望为
  • 我们需要 而不使用 Bootstrap 吗?

    如果我们不使用 Bootstrap 我们还需要 in 我们的 HTML 页面 YES 与Bootstrap框架完全无关 应该在every网页 无论您使用什么框架 The viewport META tag allows device wid
  • 使用大量静态方法是一件坏事吗?

    当类不需要跟踪内部状态时 我倾向于将类中的所有方法声明为静态 例如 如果我需要将 A 转换为 B 并且不依赖于某些可能变化的内部状态 C 我会创建一个静态转换 如果我希望能够调整内部状态 C 那么我添加一个构造函数来设置 C 并且不使用静态
  • 旋转位图导致 outOfMemoryException

    我以这种方式旋转位图 单击每个按钮时图像都会旋转 90 度 Matrix matrix new Matrix matrix postRotate 90 rotated Bitmap createBitmap rotated 0 0 rota
  • 发生什么 Azure Kubernetes (AKS)“超时”会断开集群中 Pod 进出的连接?

    我有一个工作集群 其中的服务全部响应在 Azure AKS 上运行的安装了 Ingress nGinx 的 helm 后面 这最终是 Azure 特定的 我的问题是 为什么我与此集群中的服务 Pod 的连接会定期被切断 显然是由于某种空闲超
  • 理解Python中的repr()函数

    repr 对象的可计算字符串表示形式 可以 eval 它 意味着它是一个计算结果为 Python 的字符串表示形式 目的 换句话说 gt gt gt x foo gt gt gt repr x foo 问题 为什么我这样做时会得到双引号re
  • 对象“xxxxxxx”、数据库“zzzzzzz”、架构“dbo”的 EXECUTE 权限被拒绝

    我在执行函数时遇到问题 这就是我所做的 使用 SQL Server Management Studio 创建函数 就创建成功了 然后我尝试执行新创建的函数 这就是我得到的结果 EXECUTE 权限被拒绝 对象 xxxxxxx 数据库 zzz
  • unity3d中如何隐藏InputField附加输入框

    I use a FiledInput在 android 应用程序中 当我开始将字符串放入其中时softkeyboard弹出一个框 我想摆脱它 有什么方法可以使用Unity3d 4 6 2f1 您可以使用输入字段 shouldHideMobi
  • 如何突出显示基于当前页面的链接?

    抱歉 如果这听起来像是一个非常愚蠢的问题 但当您位于链接到的页面上时 我需要使链接改变颜色 例如 当您访问 StackOverflow 的 问题 页面时 顶部的链接会改变颜色 你怎么做到这一点 这是服务器端的事情 在渲染页面时 向链接添加一
  • System.ObjectDisposeException:无法访问关闭的流

    这是否确实意味着该流已被代码处置 无论是在 using 中还是通过调用 dispose 流可能已在此代码之外关闭 并且此异常仍然会发生 所以我将以我的评论作为答案 是的 流也可以从代码外部关闭 所以请确保检查System ObjectDis
  • 求0、2、4、6、8组成的递增数列中的第n个数?

    我们有一个递增序列 其中每个元素仅由偶数组成 0 2 4 6 8 我们怎样才能find the nth number in this sequence 是否有可能在 O 1 时间内找到该序列中的第 n 个数字 顺序 0 2 4 6 8 20
  • 在Rcpp中实现apply函数

    我一直在尝试在 Rcpp 中实现 apply 函数 到目前为止代码如下所示 Rcpp export NumericVector apply NumericMatrix x int dim Function f NumericVector o
  • 在 C 语言中,声明指针的正确语法是什么?

    我依稀记得之前在另一个问题的回答中看到过这个 但搜索并没有找到答案 我不记得是什么了proper声明变量为指针的方法 是吗 Type instance Or Type instance 尽管我知道两者在大多数情况下都会编译 但我相信在某些示
  • false' 在 maven 3' aria-label=''false' 在 maven 3'> 'false' 在 maven 3

    为什么 maven 3 在 pom xml 的快照存储库配置中贬值 false 其背后的动机是什么
  • 从应用程序注销后如何取消订阅 FCM 通知?

    我已经在我的应用程序中实现了 Firebase 云消息传递以用于推送通知 一切工作正常 但即使用户从应用程序注销 也会收到通知 我听说 当用户从应用程序注销时 我需要删除 FCM 令牌 所以我在注销方法中这样做了 void logout F
  • 如何为vim设置syntastic?

    所以我将存储库克隆到 vim bundle并安装了病原体 我可以确定病原体工作正常 因为我的捆绑包中的其他插件都工作正常 经过谷歌搜索一段时间后 似乎 syntastic 应该可以直接用于 c 代码 我还检查了我是否拥有指定的所有可执行文件
  • T-SQL - 什么是内联视图?

    我最近回答了这个问题如何按顺序调用用户定义的函数以与按顺序选择组一起使用 我的答案是使用内联视图来执行该功能 然后对其进行分组 在评论中 提问者没有理解我的回答 并要求提供一些网站 参考资料来帮助解释 我快速谷歌了一下 没有找到任何很好的资
  • 在 Swift 中使用 NumberFormatter 格式化大十进制数

    我这样做是为了格式化数字 但对于大数字来说失败 let formatter NumberFormatter formatter numberStyle decimal if let number formatter number from