设置大货币数字的格式

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(使用前将#替换为@)

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

随机推荐

  • 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