CurrencyText 2.2.0

CurrencyText 2.2.0

Felipe Marino 维护。



  • Felipe Lefèvre Marino

Build Status Coverage Status Swift Platform Swift Package Manager CocoaPods Compatible Twitter

⭐️ 给我点星以关注此项目 ⭐️

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

货币和区域设置 -轻松定义格式样式

要定义货币样式(符号、格式、分隔符),必须使用 currencylocale 属性。重要的是指出,如果这些未定义,则自动使用当前用户区域设置,以及货币格式。例如,如果用户位置设置为 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属性可以用来监听并潜在地处理发送到CurrencyUITextFieldDelegateUITextFieldDelegate事件。当例如追踪分析事件时,这可以非常有用。

但是请注意确保此对象的实现不会以错误地干扰货币格式化,例如在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