swift - 将 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)?如果有更好的方法来实现这一点?
解决方案
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
生成您自己的格式String
Double
我读过几篇使用双精度或浮点数的帖子不好
所以,是的,将货币价值保持为 a Double
orFloat
通常是一个坏主意,货币价值通常保持为 a Int
or Long
,但这是由于计算机中的表示方式Double
和Float
表示方式,对于一般来说,演示文稿,你应该没问题,但每个用例都需要评估。
推荐阅读
- swift - 无法更改 UILabel 子类中的属性
- scheduled-tasks - 使用 Windows Server 故障转移群集的群集任务
- node.js - 内部调用nestjs控制器函数时不调用管道
- reactjs - 如何在反应 konva 中破坏特定层
- plot - 绘制正态分布的概率密度函数,但 y 高于 1?
- python - 有什么方法可以在reportlab中插入圆形照片?
- angular - 在 Angular 中使用 BsDatePickerModule 的开发问题
- spring-security - 未来分配的 Azure AD B2C 不记名令牌“nbf”值
- android - 我该如何解决这个 gradle task assembleDebug 的错误
- azure - How to download artifacts from the last job execution when retrying a job in the same stage using Yaml pipelines?