阿拉伯数字转人民币金额大写
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
}
}