58 - Swift 之 千分位的添加

一 、千分位的介绍

在一些商城或者金融类的App开发中,数字的显示出现非常频繁。数字位数很多的情况下,用不不能一眼看出是多少,所以为了能够增加体验就必须添加千分位。

二、千分位添加的思路

  • 判断传入的参数是否带有小数。如果带小数,就将参数分位 整数(A)小数 (B) 两个部分,否则,整体归为 (A)

  • (A) 进行除以 1000 求商,商为 (X) ; 余数为 (Y)。同时将(Y) 存放到一个可变的数组(KA)里。

  • 如果 (X) 不为 0,则 将 (X) 重新赋值给 (A)。在对 (A) 进行除以 1000 求商,商为 (X) ; 余数为 (Y)。同时将(Y) 插入到一个可变的数组(KA)的第一个位置里。这样循环一直到 (X) 等于 0 为止。

  • 然后从 (KA) 里面顺序取出对象并拼接,就可以了。

三 、千分位添加使用到的知识点

  • 类的扩展 extension

  • 获取字符串的长度

  • 字符串和数之间的转换

  • 三目运算

  • 数组的遍历循环

  • repeat.... while.... 循环的使用

四、千分位添加的代码

// MARK : 添加千分位的函数实现
func addMicrometerLevel(valueSwift:String) -> String {
    // 判断传入参数是否有值
    if valueSwift.characters.count != 0 {
        /**
         创建两个变量
         integerPart : 传入参数的整数部分
         decimalPart : 传入参数的小数部分
         */
        var integerPart:String?
        var decimalPart = String.init()
        
        // 先将传入的参数整体赋值给整数部分
        integerPart =  valueSwift
        // 然后再判断是否含有小数点(分割出整数和小数部分)
        if valueSwift.contains(".") {
            let segmentationArray = valueSwift.components(separatedBy: ".")
            integerPart = segmentationArray.first
            decimalPart = segmentationArray.last!
        }
        
        /**
         创建临时存放余数的可变数组
         */
        let remainderMutableArray = NSMutableArray.init(capacity: 0)
        // 创建一个临时存储商的变量
        var discussValue:Int32 = 0
        
        /**
         对传入参数的整数部分进行千分拆分
         */
        repeat {
            let tempValue = integerPart! as NSString
            // 获取商
            discussValue = tempValue.intValue / 1000
            // 获取余数
            let remainderValue = tempValue.intValue % 1000
            // 将余数一字符串的形式添加到可变数组里面
            let remainderStr = String.init(format: "%d", remainderValue)
            remainderMutableArray.insert(remainderStr, at: 0)
            // 将商重新复制
            integerPart = String.init(format: "%d", discussValue)
        } while discussValue>0
        
        // 创建一个临时存储余数数组里的对象拼接起来的对象
        var tempString = String.init()

        // 根据传入参数的小数部分是否存在,是拼接“.” 还是不拼接""
        let lastKey = (decimalPart.characters.count == 0 ? "":".")
        /**
         获取余数组里的余数
         */
        for i in 0..<remainderMutableArray.count {
            // 判断余数数组是否遍历到最后一位
            let  param = (i != remainderMutableArray.count-1 ?",":lastKey)
           tempString = tempString + String.init(format: "%@%@", remainderMutableArray[i] as! String,param)
        }
        //  清楚一些数据
        integerPart = nil
        remainderMutableArray.removeAllObjects()
        // 最后返回整数和小数的合并
        return tempString as String + decimalPart
    }
    return valueSwift
}

五、 千分位类的扩展

// MARK : 我们要进行类的扩展
extension String  {
    
    // MARK : 添加千分位的函数实现
    func addMicrometerLevel() -> String {
        // 判断传入参数是否有值
        if self.characters.count != 0 {
            /**
             创建两个变量
             integerPart : 传入参数的整数部分
             decimalPart : 传入参数的小数部分
             */
            var integerPart:String?
            var decimalPart = String.init()
            
            // 先将传入的参数整体赋值给整数部分
            integerPart =  self
            // 然后再判断是否含有小数点(分割出整数和小数部分)
            if self.contains(".") {
                let segmentationArray = self.components(separatedBy: ".")
                integerPart = segmentationArray.first
                decimalPart = segmentationArray.last!
            }
            
            /**
             创建临时存放余数的可变数组
             */
            let remainderMutableArray = NSMutableArray.init(capacity: 0)
            // 创建一个临时存储商的变量
            var discussValue:Int32 = 0
            
            /**
             对传入参数的整数部分进行千分拆分
             */
            repeat {
                let tempValue = integerPart! as NSString
                // 获取商
                discussValue = tempValue.intValue / 1000
                // 获取余数
                let remainderValue = tempValue.intValue % 1000
                // 将余数一字符串的形式添加到可变数组里面
                let remainderStr = String.init(format: "%d", remainderValue)
                remainderMutableArray.insert(remainderStr, at: 0)
                // 将商重新复制
                integerPart = String.init(format: "%d", discussValue)
            } while discussValue>0
            
            // 创建一个临时存储余数数组里的对象拼接起来的对象
            var tempString = String.init()
            
            // 根据传入参数的小数部分是否存在,是拼接“.” 还是不拼接""
            let lastKey = (decimalPart.characters.count == 0 ? "":".")
            /**
             获取余数组里的余数
             */
            for i in 0..<remainderMutableArray.count {
                // 判断余数数组是否遍历到最后一位
                let  param = (i != remainderMutableArray.count-1 ?",":lastKey)
                tempString = tempString + String.init(format: "%@%@", remainderMutableArray[i] as! String,param)
            }
            //  清楚一些数据
            integerPart = nil
            remainderMutableArray.removeAllObjects()
            // 最后返回整数和小数的合并
            return tempString as String + decimalPart
        }
        return self
    }
    
    // MARK : 获取字符串的长度
    func length() -> Int {
        /**
         另一种方法:
         let tempStr = self as NSString
         return tempStr.length
         */
        return self.characters.count
    }
}

六 、两种添加千分位的方法的测试

1> 类的扩展方式

/**
 类的扩展测试
 */
let strExtension = "12345678"
print(strExtension.addMicrometerLevel())
print(strExtension.length())

print("-------******---------")

let strExtensionF = "12345678.09"
print(strExtensionF.addMicrometerLevel())
print(strExtensionF.length())

print("-------******---------")

let strExtensionK = "000.66"
print(strExtensionK.addMicrometerLevel())
print(strExtensionK.length())

效果展示

5614E417-730F-4005-B4BC-9649446EA43B.png

2> 直接方法添加千分位

print("---------XXXXXX---------")

// MARK : 方法的测试

let str = self.addMicrometerLevel(valueSwift: strExtension)
print(str)

let strF = self.addMicrometerLevel(valueSwift: strExtensionF)
print(strF)

let strK = self.addMicrometerLevel(valueSwift: strExtensionK)
print(strK)

效果展示

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

推荐阅读更多精彩内容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:选D,7+9=16;9+(-1)=8;(...
    Alex_bingo阅读 18,816评论 1 19
  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 2,588评论 0 5
  • 1. 下列叙述错误的是()。 (2.0 分) A. 质量管理包括QA和QC一切活动的全部过程 B. 影像质量是指对...
    我们村我最帅阅读 3,769评论 0 8
  • 任大包,是一个带你到处游玩,找到新朋友的旅游体体验新媒体,面向喜欢到处旅行的旅游达人或者计划团队出游的公司,将他们...
    大包大阅读 459评论 0 0
  • 金黄的羽翼在火中烧毁 孤单的蝉啊 要怎样飞翔 驾驭着风去寻 失掉的伴侣 流浪的猫 你不必悲伤 至少你还在找家 不似...
    寒斋书郎阅读 219评论 4 3