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

2022-01-07  本文已影响0人  leblanc_i
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
    }
    
}

上一篇下一篇

猜你喜欢

热点阅读