首页 > 解决方案 > 将 Swift 字符串转换为 swift-currency/USD 格式的最佳方法是什么?

问题描述

如何将字符串转换为“货币”格式 USD(xxx)?我正在尝试使用以下库: https ://github.com/peek-travel/swift-currency

我希望能够接受一个字符串:

var testStr1 = "$30.01"
var testStr2 = "$ 30.01"

并将其转换为货币,因为我从几篇文章中读到使用双精度或浮点数是不好的,但如果我从字符串开始,我还能将它转换成什么?

我以为我可以使用“导入货币”库来做到这一点,但这不起作用。

let updatedString = testStr1.replacingOccurrences(of: "$", with: "") 
                        let formatter = NumberFormatter()
                        formatter.locale = Locale.current // USA: Locale(identifier: "en_US")
                        formatter.numberStyle = .decimal
                        let number = formatter.number(from: test)
var dollars = USD(updatedString)

如何将字符串转换为“货币”格式 USD(xxx)?如果有更好的方法来实现这一点?

标签: swift

解决方案


Himanshu 提出的基本概念工作正常,但您的问题不一定是使用适当的格式化程序,而是如何修复您的输入,因为格式化程序需要 aNSNumber而不是 a String

因此,快速的互联网检查让我查看了快速从字符串中删除所有非数字字符

所以我可以用String, 过滤掉所有“非数字”的垃圾,然后把它Double弄出来。

let input = Double(value.filter("0123456789.".contains))

从那里我能够借用Himanshu的概念并制作一个简单的format功能

func format(_ value: String, locale: Locale = Locale.current) -> String? {
    
    guard let input = Double(value.filter("0123456789.".contains)) else { return nil }

    //value.trimmingCharacters(in: .whitespacesAndNewlines)
    
    let currencyFormatter = NumberFormatter()
    currencyFormatter.usesGroupingSeparator = true
    currencyFormatter.numberStyle = .currency
    
    currencyFormatter.locale = locale
    
    return currencyFormatter.string(from: NSNumber(value: input))
}

然后我使用 Playground 来测试它

var testStr1 = "$30.01"
var testStr2 = "$ 30.01"

format(testStr1, locale: Locale(identifier: "en_US")) // $30.01
format(testStr2, locale: Locale(identifier: "en_US")) // $30.01

format(testStr1, locale: Locale(identifier: "fr_FR")) // 30,01 €
format(testStr2, locale: Locale(identifier: "fr_FR")) // 30,01 €

format(testStr1, locale: Locale(identifier: "de_DE")) // 30,01 €
format(testStr2, locale: Locale(identifier: "de_DE")) // 30,01 €

现在,如果您特别想USD(xxx)用作格式,那么您可以简单地使用基本格式并从输入的结果转换NumberFormatter生成您自己的格式StringDouble

我读过几篇使用双精度或浮点数的帖子不好

所以,是的,将货币价值保持为 a DoubleorFloat通常是一个坏主意,货币价值通常保持为 a Intor Long,但这是由于计算机中的表示方式DoubleFloat表示方式,对于一般来说,演示文稿,你应该没问题,但每个用例都需要评估。


推荐阅读