CurrencyText 是一个轻量级框架,用于将文本字段内的文本格式化为货币形式UITextFieldDelegate
,可以连接到 任何 文本字段。是的,无需使用特定的 UITextField
子类
它的主要核心,CurrencyFormatter
类,除了可以用于文本字段外,还可以用来格式化任何可以表示为货币的价值。
如果您需要显示货币格式的文本或允许用户输入货币数据,CurrencyText
将能帮助您以一种高度可读和可配置的方式完成任务。
文档
CurrencyFormatter
简介
CurrencyText 是基于 CurrencyFormatter
制作的,CurrencyFormatter
是一个围绕数字格式化器带有货币数字样式的包装器。它可以单独使用,或者注入到 CurrencyTextFieldDelegate
中来自动格式化文本字段的输入。
基本设置
CurrencyFormatter
封装了数字格式化器的货币属性。
创建一个 CurrencyFormatter
实例很简单;你可以使用可读的构建者模式方法,其中初始化类要求传递一个回调,在该回调中传入 self 实例,允许你通过保持代码干净和可读来配置你的属性(受到 SwiftRichString 的启发)Inspired by SwiftRichString
let formatter = CurrencyFormatter {
$0.currency = .euro
// ... set any other attribute
}
let formattedString = formatter.string(from: 30.0) //€30.00
货币和区域设置
-轻松定义格式样式
要定义货币样式(符号、格式、分隔符),必须使用 currency
和 locale
属性。重要的是指出,如果这些未定义,则自动使用当前用户区域设置,以及货币格式。例如,如果用户位置设置为 pt_BR
(标识符),则金额100将显示为 R$ 100,00
。当需要时,可以将货币设置为巴西雷亚尔,并将位置设置为葡萄牙巴西。
位置
- 设置货币的位置
所有位置都是从 jacobbubu - ioslocaleidentifiers 提取的。
CurrencyLocale
类型封装了所有可用的位置标识符在枚举类型中。格式化器的 location
属性可以通过传递常用的系统位置或 CurrencyLocale 的一个案例,如 .italian、.danish 或 .chinese 来设置。请注意,您可以定义位置并将其与您选择的货币组合,一般只会更改货币符号。
public enum CurrencyLocale: String, LocaleConvertible {
case current = "current"
case autoUpdating = "currentAutoUpdating"
case afrikaans = "af"
case afrikaansNamibia = "af_NA"
case afrikaansSouthAfrica = "af_ZA"
//...
}
货币
- 如何通过名称选择特定的货币
封装了ISO 4217 国际标准化货币代码
货币
类型包含了作为枚举情况的原始值的货币代码,这使得设置所需的格式化器(例如 .欧元、.美元、.巴西雷亚尔)变得更简单。
public enum Currency: String {
case afghani = "AFN",
algerianDinar = "DZD",
argentinePeso = "ARS"
//...
}
请注意,定义货币并不总是按计划进行,因为大部分格式通常根据用户地区来调整。例如,将 .欧元 设置为货币,但对于默认用户地区(巴西),将使用巴西的货币符号、分隔符和样式。
let formatter = CurrencyFormatter {
$0.currency = .dollar
$0.locale = CurrencyLocale.englishUnitedStates
}
let formattedString = formatter.string(from: 30.0) //$30.00
高级设置
对于那些需要自定义展示的设计情况,您可以进行大量自定义格式化器。我们可以去掉小数位、设置最大允许值、自定义分组大小或甚至设置全新的货币符号。一切尽在您的掌握之中。
let formatter = CurrencyFormatter {
$0.hasDecimals = false
$0.maxValue = 999999
$0.groupingSize = 2
$0.groupingSeparator = ";"
$0.currencySymbol = "💶"
}
let formattedString = formatter.string(from: 100000000) //💶99;99;99
CurrencyTextFieldDelegate
- 格式化用户输入为货币
CurrencyTextFieldDelegate
是一个继承自 UITextFieldDelegate
的类型,提供一个简单接口来配置如何将输入配置为货币。它可以与任何 UITextField
一起使用。
设置您的文本字段以格式化输入
要开始将用户的输入格式化为货币,您需要初始化一个CurrencyTextFieldDelegate
实例,传递一个按您的喜好配置的货币格式化器,然后将它设置为文本字段的代理。
let currencyFormatter = CurrencyFormatter()
textFieldDelegate = CurrencyUITextFieldDelegate(formatter: currencyFormatter)
textFieldDelegate.clearsWhenValueIsZero = true
textField.delegate = textFieldDelegate
只设置一个具有给定格式化器行为的货币文本字段代理对象到您的文本字段,用户的输入将会被格式化如预期。
使用中继代理
CurrencyTextFieldDelegate
实例上的passthroughDelegate
属性可以用来监听并潜在地处理发送到CurrencyUITextFieldDelegate
的UITextFieldDelegate事件
。当例如追踪分析事件时,这可以非常有用。
但是请注意并确保此对象的实现不会以错误地干扰货币格式化,例如在textField(textField:shouldChangeCharactersIn:replacementString:)
上返回false
时不进行货币格式化。
let currencyTextFieldDelegate = CurrencyUITextFieldDelegate(formatter: currencyFormatter)
currencyTextFieldDelegate.passthroughDelegate = selfTextFieldDelegateListener
textField.delegate = currencyTextFieldDelegate
// all call to `currencyTextFieldDelegate` `UITextField` delegate methods will be forwarded to `selfTextFieldDelegateListener`.
允许用户输入负数
如果想让用户能够输入负数,只需将文本字段的keyboardType
设置为.numbersAndPunctuation
,这样当用户点击负号时,它将会被正确呈现和处理。
textField.keyboardType = .numbersAndPunctuation
// users inputs "-3456"
// -R$ 34.56
CurrencyFormatter类可用的属性
以下属性是可用的
属性 | 类型 | 描述 |
---|---|---|
locale | LocaleConvertible |
货币的本地化 |
currency | 货币 |
用于格式化的货币 |
currencySymbol | String |
以货币符号显示的字符串 |
showCurrencySymbol | Bool |
显示/隐藏货币符号 |
minValue | Double? |
允许作为输入的最小数值 |
maxValue | Double? |
允操作为输入的最高数值 |
decimalDigits | Int |
显示的小数位数 |
hasDecimals | Bool? |
是否显示小数位 |
小数分隔符 | String |
用于分隔小数位的文本 |
货币代码 | String |
货币原始代码值 |
总是显示小数分隔符 | Bool |
即使在没有小数位的情况下也显示小数分隔符 |
groupingSize | Int |
分组数字的数量 |
secondaryGroupingSize | Int |
第一组之后的分组数量 |
groupingSeparator | String |
显示在数字分组之间的字符串 |
hasGroupingSeparator | Bool |
在所有数字组之间添加分隔符 |
maxIntegers | Int |
允许的最大整数位数 |
maxDigitsCount | Int |
返回最大位数(整数 + 小数) |
zeroSymbol | String |
当字符串的值等于零时显示的文本 |
需求
CurrencyText与Swift 3.x兼容。仅支持iOS 9.0+
。但是计划很快支持其他苹果操作系统。
安装
Swift包管理器
使用Swift包管理器安装,只需通过Xcode内置的Swift Packages
或手动添加到Package.swift
包的依赖项中添加此存储库。
dependencies: [
.package(url: "https://github.com/marinofelipe/CurrencyText.git", from: "2.1.0")
]
通过CocoaPods安装
要将CurrencyText集成到Xcode项目中,请通过CocoaPods指定它,在Podfile
中指定。
# Podfile
use_frameworks!
target 'YOUR_TARGET_NAME' do
pod 'CurrencyText'
end
CurrencyUITextField
的用户,您只能下载子组件CurrencyText/Formatter
。
对于不需要
贡献
我们随时欢迎贡献和建议。请随意Fork、关注、提出问题和发送Pull Requests。主要项目中可见的问题、里程碑以及我们目前正在处理的工作。
特别感谢
@malcommac,他为SwiftRichString和SwfitDate做出的杰出贡献启发了说明书中的一些细节,"CurrencyLocale"枚举以及带有处理器回调的初始化器。还要感谢myanalysis,他通过发现问题和提出良好建议做出了巨大贡献。
版权
CurrencyText遵从MIT许可证。详细请见LICENSE文件。
Felipe Marino: [email protected], @_marinofelipe