美文网首页
阿拉伯数字转人民币金额大写

阿拉伯数字转人民币金额大写

作者: leblanc_i | 来源:发表于2022-01-07 17:46 被阅读0次
    class ArabicNumeralTurnCapitalCNY {
        
        
        /// 获取人民币大写金额
        /// - Parameter money: 要转换的金额,阿拉伯数字123456789
        /// - Returns: 人民币大写金额
        static func getCapitalCNY(_ money: String) -> String {
            
            if money.count == 0 || Double(money) == 0 {
                return "零元整"
            }
            
            // 整数位
            let leftCarrayArray = ["元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", "佰", "仟" , "京", "十京", "百京", "千京垓", "十垓", "百垓", "千垓秭", "十秭", "百秭", "千秭穰", "十穰", "百穰", "千穰"]
            // 小数位
            let rightCarrayArray = ["分", "角"]
            // 阿拉伯数字对应人民币大写字符
            let numArray = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]
            
            // 金额转字符串,保留两位小数
            let ss = Double(money)
            let moneyStr = String(format: "%.2f", ss!)
            
            // 将金额分隔成整数和小数两部分
            let moneyArray = moneyStr.components(separatedBy: ".")
            // 小数点前的数值字符串
            let integerStr = moneyArray[0]
            // 小数点后数值字符串
            var decimalStr = moneyArray[1]
            
            // 是否拼接了“零”,做标记
            var isZero = false
            // 人民币大写金额
            var cnyStr = ""
            
            // 左边整数数组
            let integerStrArr = integerStr.map(String.init)
            
            // 遍历整数位
            for (idx, _) in integerStr.enumerated().reversed() {
                
                // 获取整数最高位数
                let tt = integerStrArr[integerStr.count - idx - 1]
                let topDigit: Int = Int(tt) ?? 0
                
                if numArray[topDigit] == "零" {
                    
                    if leftCarrayArray[idx] == "万" || leftCarrayArray[idx] == "亿" || leftCarrayArray[idx] == "元" || leftCarrayArray[idx] == "兆" {
                        
                        // 去除有"零万"的情况
                        if isZero {
                            cnyStr.removeLast()
                            cnyStr += leftCarrayArray[idx]
                            isZero = false
                        } else {
                            cnyStr += leftCarrayArray[idx]
                            if leftCarrayArray[idx] != "元" {
                                cnyStr += "零"
                            }
                            isZero = false
                        }
                        
                        // 去除有“亿万”“兆万”的情况
                        if leftCarrayArray[idx] == "万" {
                            if cnyStr.last == "亿" || cnyStr.last == "兆" {
                                cnyStr.removeLast()
                            }
                        }
                        
                        // 去除“兆亿”
                        if leftCarrayArray[idx] == "亿" {
                            if cnyStr.last == "兆" {
                                cnyStr.removeLast()
                            }
                        }
                        
                    } else {
                        if !isZero {
                            cnyStr += numArray[topDigit]
                            isZero = true
                        }
                    }
                    
                } else {
                    // 拼接数字
                    cnyStr += numArray[topDigit]
                    // 拼接位
                    cnyStr += leftCarrayArray[idx]
                    // 不为零
                    isZero = false
                }
            }
            
            
            // 处理小数位
            if decimalStr == "00" {
                cnyStr += "整"
            } else {
                // 如果最后一位为0,就去掉最后一位
                if  decimalStr.last == "0" {
                    decimalStr.removeLast()
                }
                
                // 左边整数数组
                let decimalStrArr = decimalStr.map(String.init)
                
                // 遍历小数位
                for (idx, _) in decimalStr.enumerated().reversed() {
                    
                    // 获取小数最高位数
                    let tt = decimalStrArr[decimalStr.count - idx - 1]
                    let dTopDigit: Int = Int(tt) ?? 0
                    
                    cnyStr += numArray[dTopDigit]
                    cnyStr += rightCarrayArray[idx]
                    
                    // 如果角是零,单独判断一下
                    if numArray[dTopDigit] == "零" && rightCarrayArray[idx] == "角" {
                        cnyStr.removeLast()
                    }
                }
            }
            
            // 比如0.12,去掉最前面的元
            if cnyStr.first == "元" {
                cnyStr.removeFirst()
            }
            
            return cnyStr
        }
        
    }
    
    

    相关文章

      网友评论

          本文标题:阿拉伯数字转人民币金额大写

          本文链接:https://www.haomeiwen.com/subject/hgojcrtx.html