设置大货币数字的格式

2023-12-12

使用 FormatStyle API,是否可以使用“20M”或“10k”等尾随 SI 单位来格式化大数字?特别是,我正在寻找一种使用适当的本地化和货币符号来格式化大货币值(例如“$20M”)的方法。

我目前有一个货币格式化程序:

extension FormatStyle where Self == FloatingPointFormatStyle<Double>.Currency {
    public static var dollars: FloatingPointFormatStyle<Double>.Currency {
        .currency(code: "usd").precision(.significantDigits(2))
    }
}

我想将其扩展为格式Double(20_000_000)为“2000万美元”。


您可以创建一个自定义struct符合FormatStyle

public struct ShortCurrency<Value>: FormatStyle, Equatable, Hashable, Codable where Value :  BinaryFloatingPoint{
    let locale: Locale
    enum Options: Int{
        case million = 2
        case billion = 3
        case trillion = 4
        
        func short(locale: Locale) -> String{
            switch self {
            case .million:
                return millionAbbr[locale, default: "M"]
            case .billion:
                return billionAbbr[locale, default: "B"]
            case .trillion:
                return trillionAbbr[locale, default: "T"]
            }
        }
        ///Add other supported locales
        var millionAbbr: [Locale: String] { [Locale(identifier: "en_US") : "M"]}
        var billionAbbr: [Locale: String]  { [Locale(identifier: "en_US") : "B"]}
        var trillionAbbr: [Locale: String]  { [Locale(identifier: "en_US") : "T"]}
    }
    public func format(_ value: Value) -> String {
        let f = NumberFormatter()
        f.locale = locale
        f.numberStyle = .currency
        f.usesSignificantDigits = true

        let basic = f.string(for: value) ?? "0"
        let count = basic.count(of: ".000")
        //Checks for million value
        if let abbr = Options(rawValue: count)?.short(locale: f.locale){
            //Get the symbol and the most significant numbers
            var short = String(basic.prefix(basic.count - (4*count)))
            //Append from the dictionary based on locale
            short.append(abbr)
            //return modified string
            return short
        }else{
            //return the basic string
            return basic
        }
    }
    
}

extension String {
    
    func count(of string: String) -> Int {
        guard !string.isEmpty else{
            return 0
        }
        var count = 0
        var searchRange: Range<String.Index>?
        
        while let foundRange = range(of: string, options: .regularExpression, range: searchRange) {
            count += 1
            searchRange = Range(uncheckedBounds: (lower: foundRange.upperBound, upper: endIndex))
        }
        return count
    }
}

然后延伸FormatStyle

@available(iOS 15.0, *)
extension FormatStyle where Self == FloatingPointFormatStyle<Double>.Currency {
    public static func shortCurrency (locale: Locale? = nil) -> ShortCurrency<Double> {
        return ShortCurrency(locale: locale ?? .current)
    }
}

它将像任何其他产品一样可供使用FormatStyle

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

设置大货币数字的格式 的相关文章

  • 将自定义图像设置为 UIBarButtonItem 但它不显示任何图像

    我想将自定义图像设置为 UIBarButtonItem 但它只显示周围的矩形框并且不显示实际图像 func setupBrowserToolbar let browser UIToolbar frame CGRect x 0 y 20 wi
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • Swift:如何减少 didupdatelocations 调用

    我想出了一些代码来打印我所在位置的地址和邮政编码 这是在 didupdatelocation 函数中完成的 我遇到的唯一问题是 didupdatelocation 函数每秒都会更新该地址 因为这电池效率非常低 所以我一直在寻找使用间隔的方法
  • SwiftUI:状态栏颜色

    有没有办法将 SwiftUI 视图的状态栏更改为白色 我可能错过了一些简单的东西 但我似乎找不到在 SwiftUI 中将状态栏更改为白色的方法 到目前为止我只看到 statusBar hidden Bool 状态栏文本 色调 前景色可以通过
  • 检测 AVAudioPlayer 中的播放结束

    我有几个短的 mp3 声音 我将它们存储在数组中 并希望连续播放它们 有什么方法可以检测 AVAudioPlayer 何时停止播放 以便我可以调用完成处理程序并播放下一个声音 我知道有一个委托 但我正在使用 Playground 和 SKS
  • 为什么这个谓词格式会变成 '= nil'

    有人建议这个线程 https stackoverflow com questions 40686005 nspredicate crash after swift 3 migration与我的问题完全相同 但是 我的应用程序没有崩溃 并且我
  • 在真实设备上展示测试广告

    这是我的代码 let request GADRequest request testDevices kGADSimulatorID XXXX2F32d69CCA859FFB559D0FEA3CF6483D08A6 adView load r
  • CGPoint 标量乘法 Swift

    我正在 SpriteKit 中构建一个平台游戏 并将为我的实体实现更新功能 以便它们根据重力和速度移动 但是 我需要使添加的速度量与增量时间成比例 以防止帧速率影响我的实体的移动方式 因此我将导入 GLKit 以便我可以使用标量函数 但是
  • 使用 UISearchBar 过滤数组

    我目前正在使用以下代码来过滤数组并将结果显示在我的 tableView 中 问题是 只有当搜索与确切的单词匹配时 才会返回结果 如何更改数组过滤器以在输入时搜索每个字符 let data Mango Grape Berry Orange A
  • iOS 13 beta 外部屏幕上的 OverscanCompensation

    我正在测试一个应用程序的测试版 但遇到了外部屏幕的问题 我们看到应用程序周围有黑色边框 我们之前可以通过设置来纠正它overscanCompensation to none但在 iOS 13 中 该设置根本没有任何效果 我们曾经看到一个错误
  • 如何自动缩放mapView以显示叠加层

    我可以在 mapView 上绘制多边形 但是我需要找到多边形并手动缩放它 有没有办法自动执行此过程 例如调整中心多边形 我浏览过互联网并阅读了一些相关文章 其中大多数都是基于折线和点的 任何形式的帮助将不胜感激 因为我正在寻找解决方案一段时
  • 无法将“SDWebImageActivityIndi​​cator”类型的值分配给“ST_SDWebImageIndicator”类型?

    I have multiple flavours targets in my Xcode project I am also using SDWebImage in my app Everything was working fine un
  • 如何防止 RealmSwift 列表中出现重复项?

    如何防止向列表中添加重复项RealmSwift 我有我的User作为领域对象 但真正的数据源是服务器 只是使用领域在本地缓存用户 当我从服务器获取当前用户数据时 我想确保存储在领域中的用户拥有来自服务器的所有播放列表 以及它们的曲目列表等
  • Swift 3 错误:[_SwiftValue pointSize] 无法识别的选择器发送到实例

    我刚刚将我们的项目迁移到 swift 3 发现由于一个问题导致大量崩溃 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 SwiftValue pointSize 发送到实例的无法识别的选择器 该
  • Swift 中带圆角的 NSWindow

    我想要一个圆角的窗户 但我在每个角落都有一个白点 Code let effect NSVisualEffectView frame NSRect x 0 y 0 width 0 height 0 effect blendingMode be
  • Swift 中具有透明背景的按钮边框

    我怎样才能做一个UIButton边框看起来像下图 入门 按钮一样具有透明背景吗 我应该如何使用情节提要来实现这一点 或者如何以编程方式实现这一点 设置backgroundColor to clearColor使按钮透明 例如尝试下面的代码
  • 无法转换“UINavigationController”类型的值

    我正在为我的应用程序实现一个搜索界面 因此基本上我会将搜索关键字从一个 ViewController 传递到另一个 ViewController 我已经多次进行过这种类型的参数传递 但这次似乎有些奇怪 目标 ViewController 嵌
  • 将数字分解为单个数字的数组

    如果我有整数 123 并且我想将数字分解为数组 1 2 3 最好的方法是什么 我已经搞乱了很多 并且我有以下工作 var number 123 var digits Array String number map Int strtoul S
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

    与最初的代码相比 唯一的更改是在ViewControl swift override func viewDidLoad newMessage hidden true super viewDidLoad Do any additional s

随机推荐

  • Moment JS 给定月份的开始和结束

    我需要计算给定年份 2014 年和月份 9 2014 年 9 月 的 JS 日期 我试过这个 var moment require moment var startDate moment year month 01 00 00 00 var
  • SQL中的“@”符号有什么作用?

    我浏览了这些问题并注意到了这一点 SELECT prodid issue FROM Sales WHERE custid custid AND datesold SELECT MAX datesold FROM Sales s WHERE
  • Python 中的 Decimal 对象的除法和乘法

    在以下代码中 coeff1 和 coeff2 都是 Decimal 对象 当我使用 type coeff1 检查它们的类型时 我得到 类 decimal Decimal 但是当我编写测试代码并检查十进制对象时 我得到十进制 十进制 不带词类
  • 如何在元素的一侧添加框阴影?

    我需要在一些上创建一个盒子阴影block元素 但仅 例如 位于其右侧 我这样做的方法是将内部元素包裹起来box shadow进入一个外层padding right and overflow hidden 所以阴影的另外三个边是不可见的 有没
  • 从 .NET 后端 Azure 移动服务中的身份验证令牌获取用户信息,例如姓名、电子邮件 ID 等

    我正在使用 Azure 移动服务向我的 Windows 应用商店应用程序添加身份验证 下列的this移动服务文档中的文章我能够获取 UserId 以及MobileServiceAuthenticationToken 适用于 Google 和
  • 如何在服务中创建一个变量,该变量从 Promise 获取数据,但在两个组件之间共享?

    我在 Angular 2 中有一个使用 TypeScript 的服务 我希望能够分享我从该服务中获得的一系列值 当一个组件对数组进行更改时 我需要将其反映在另一个组件中 这是我的服务及其使用的对象的基础知识 export class dev
  • 如何使用 perl 安装 dmake?

    有人可以告诉我如何使用 Perl 下载 dmake 吗 我尝试过使用 CPAN 但这就是我得到的结果 cpan gt install dmake Database was generated on Wed 10 Jul 2019 10 13
  • 使用 PL/SQL 生成 XLS 文件

    我想使用 PL SQL 生成 XLS 文件 这包括将文本输入单元格 为单元格着色 为单元格加边框和合并单元格 这可能还包括 不同的字体 大小 样式 对齐方式和文本颜色 不同的线条排列 边框样式和颜色 不同类型 数字 文本 时间 日期 布尔值
  • 如何在 PHP 中获取给定日期范围内的每周特定日期?

    这给了我日期范围内的每个星期一的日期 问题 如何获取一周中的每个星期一和星期五 start date date Y m d end date date Y m d strtotime start date 1 MONTH for i str
  • RxJava:将一个流(Observable)作为另一个流的输入

    我还在学习 RxJava 在另一个流中使用一个流的最佳方式是什么 或者说这违反了反应式编程的原则 我试图编写的一个玩具示例包括一个 TCP 客户端和一个发回大写输入的服务器 我想从标准输入获取输入 将其发送到服务器并打印出客户端和服务器收到
  • 使用现有的 ant build.xml 文件创建 eclipse 项目

    我正在尝试从现有的 ant build xml 文件在 eclipse 中创建一个项目 我收到找到的 javac 任务列表 并指示选择单个 javac 任务继续 如何处理 javac 任务 我不建议在这个阶段采用 Ant 路线 因为它会使事
  • 如何使用 Ghostscript 将 PDF 大小调整为 8.5 x 11 英寸?

    考虑this PDF 我正在尝试使用以下命令将其转换为标准字母大小 8 5 x 11 gs dFIXEDMEDIA dBATCH dNOPAUSE sPAPERSIZE letter dPDFFitPage q sDEVICE pdfwri
  • 互斥问题

    请看一下下面的伪代码 boolean blocked 2 int turn void P int id while true blocked id true while turn id while blocked 1 id do nothi
  • pThread同步问题

    我面临 pthread 同步问题 threadWaitFunction1 是一个线程等待函数 我预计行号 第247章flag 1仅在 243 246 完成后执行 但我觉得奇怪的是 有时 在243 246还没有完成之前 它就直接跳到247 请
  • Algid 解析错误,不是序列

    当尝试使用该方法从文件中读取 RSA 私钥时 public PrivateKey getPrivateKey throws NoSuchAlgorithmException InvalidKeySpecException IOExcepti
  • 在多台计算机上获取修补程序并导出到 CSV

    如何在输出文件中正确使用 这是我的代码 get content computers txt Where AND Test Connection Quiet foreach Get Hotfix computername Select CSN
  • 在时间序列的背景下分解

    我有一个数据集 我想要整体可视化并按几个不同的变量进行分类 我创建了一个 Flexdashboard 其中包含一个闪亮的应用程序来选择分解类型 并使用工作代码来绘制正确的子集 我的方法是重复的 这向我暗示我错过了更好的方法来做到这一点 让我
  • Laravel:传递默认变量以查看

    在 Laravel 中 我们都以几乎相同的方式将数据传递到视图 data array thundercats gt Hoooooooooooh return View make myawesomeview data 但是有没有什么方法可以将
  • Tomcat 7 中的 URLRewrite

    我计划开发一个内联网应用程序 Java客户端 JSP SQLite 这样做的目标是 当用户单击链接时 如果用户有权访问 在业务逻辑中处理的团队 则应提供文件以供下载 数据库中有一个表保存信息 下面是示例行 ID file team md5
  • 设置大货币数字的格式

    使用 FormatStyle API 是否可以使用 20M 或 10k 等尾随 SI 单位来格式化大数字 特别是 我正在寻找一种使用适当的本地化和货币符号来格式化大货币值 例如 20M 的方法 我目前有一个货币格式化程序 extension