Swift - 使用NumberFormatter进行数字格式化显示(附样例)

1,将数字转成字符串

(1)最简单的便是使用 NumberFormatter 的 localizedString 方法进行数字格式化:

  • from 属性为需要格式化的数字(必须为 NSNumber 类型)
  • number 属性可以设置相应的显示样式。
import UIKit
 
class ViewController: UIViewController {
 
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //原始数字(需要先转成NSNumber类型)
        let number = NSNumber(value: 1234.5678)
         
        //四舍五入的整数
        let none = NumberFormatter.localizedString(from: number, number: .none)
        //小数形式(以国际化格式输出 保留三位小数,第四位小数四舍五入)
        let decimal = NumberFormatter.localizedString(from: number, number: .decimal)
        //百分数形式
        let percent = NumberFormatter.localizedString(from: number, number: .percent)
        //科学计数
        let scientific = NumberFormatter.localizedString(from: number, number: .scientific)
        //朗读形式(英文表示)
        let spellOut = NumberFormatter.localizedString(from: number, number: .spellOut)
        //序数形式
        let ordinal = NumberFormatter.localizedString(from: number, number: .ordinal)
        //货币形式(以货币通用格式输出 保留2位小数,第三位小数四舍五入,在前面添加货币符号)
        let currency = NumberFormatter.localizedString(from: number, number: .currency)
        //货币形式
        let currencyISOCode = NumberFormatter.localizedString(from: number,
                                                              number: .currencyISOCode)
        //货币形式
        let currencyPlural = NumberFormatter.localizedString(from: number,
                                                             number: .currencyPlural)
        //会计计数
        let currencyAccounting = NumberFormatter.localizedString(from: number,
                                                            number: .currencyAccounting)
         
        //打印结果
        print("原始值 = \(number)")
        print("none = \(none)")
        print("decimal = \(decimal)")
        print("percent = \(percent)")
        print("scientific = \(scientific)")
        print("spellOut = \(spellOut)")
        print("ordinal = \(ordinal)")
        print("currency = \(currency)")
        print("currencyISOCode = \(currencyISOCode)")
        print("currencyPlural = \(currencyPlural)")
        print("currencyAccounting = \(currencyAccounting)")
    }
}
image.png

2,将字符串转为数字

(1)NumberFormatter 除了可以将数字转成字符串,还可以将字符串转为数字。

//从字符串装成数字
let number = NumberFormatter().number(from: "1234.5678")!
 
//四舍五入的整数
let none = NumberFormatter.localizedString(from: number, number: .none)
//小数形式(以国际化格式输出 保留三位小数,第四位小数四舍五入)
let decimal = NumberFormatter.localizedString(from: number, number: .decimal)
 
//打印结果
print("原始值 = \(number)")
print("none = \(none)")
print("decimal = \(decimal)")
image.png

二、进阶用法

除了使用 NumberFormatter 的 localizedString 方法提供的几种格式化方式外。我们也可以设置 NumberFormatter 对象的相应属性,来实现定制。

1,修改分割符、分割位数

image.png
//原始值
let number = NSNumber(value: 12345.6789)
 
//创建一个NumberFormatter对象
let numberFormatter = NumberFormatter()
//设置number显示样式
numberFormatter.numberStyle = .decimal  // 小数形式
numberFormatter.usesGroupingSeparator = true //设置用组分隔
numberFormatter.groupingSeparator = "," //分隔符号
numberFormatter.groupingSize = 4  //分隔位数
//格式化
let format = numberFormatter.string(from: number)!
 
//打印结果
print("原始值 = \(number)")
print("格式化结果 = \(format)")

2,设置格式宽度、填充符、填充位置

image.png
//原始值
let number = NSNumber(value: 12345.6789)
 
//创建一个NumberFormatter对象
let numberFormatter = NumberFormatter()
//设置number显示样式
numberFormatter.numberStyle = .none //四舍五入的整数
numberFormatter.formatWidth = 10 //补齐10位
numberFormatter.paddingCharacter = "0" //不足位数用0补
numberFormatter.paddingPosition = .beforePrefix  //补在前面
//格式化
let format = numberFormatter.string(from: number)!
 
//打印结果
print("原始值 = \(number)")
print("格式化结果 = \(format)")

3,设置最大整数位数、最小整数位数

image.png
//原始值
let number = NSNumber(value: 5.6789)
 
//创建一个NumberFormatter对象
let numberFormatter = NumberFormatter()
//设置number显示样式
numberFormatter.numberStyle = .none //四舍五入的整数
numberFormatter.maximumIntegerDigits = 4 //设置最大整数位数(超过的直接截断)
numberFormatter.minimumIntegerDigits = 3 //设置最小整数位数(不足的前面补0)
//格式化
let format = numberFormatter.string(from: number)!
 
//打印结果
print("原始值 = \(number)")
print("格式化结果 = \(format)")

4,设置最大小数位数、最小小数位数

image.png
//原始值
let number = NSNumber(value: 12345.6)
 
//创建一个NumberFormatter对象
let numberFormatter = NumberFormatter()
numberFormatter.maximumFractionDigits = 3 //设置小数点后最多3位
numberFormatter.minimumFractionDigits = 2 //设置小数点后最少2位(不足补0)
//格式化
let format = numberFormatter.string(from: number)!
 
//打印结果
print("原始值 = \(number)")
print("格式化结果 = \(format)")

5,设置前缀、后缀

image.png
//原始值
let number = NSNumber(value: 12345.6789)
 
//创建一个NumberFormatter对象
let numberFormatter = NumberFormatter()
//设置number显示样式
numberFormatter.numberStyle = .none //四舍五入的整数
numberFormatter.positivePrefix = "$" //自定义前缀
numberFormatter.positiveSuffix = "元" //自定义后缀
//格式化
let format = numberFormatter.string(from: number)!
 
//打印结果
print("原始值 = \(number)")
print("格式化结果 = \(format)")

6,设置格式化字符串

image.png
//原始值
let number = NSNumber(value: -12345.6789)
 
//创建一个NumberFormatter对象
let numberFormatter = NumberFormatter()
numberFormatter.positiveFormat = "###,###.##" //设置格式
//格式化
let format = numberFormatter.string(from: number)!
 
//打印结果
print("原始值 = \(number)")
print("格式化结果 = \(format)")

https://www.hangge.com/blog/cache/detail_2086.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350