function toChineseAmount(n) {
if (isNaN(n) || n > 999999999999.99) return "无效金额";
const fraction = ['角', '分'];
const digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
const unit = [['元', '万', '亿'], ['', '拾', '佰', '仟']];
let num = Math.abs(n);
let s = '';
for (let i = 0; i < fraction.length; i++) {
const d = Math.floor(num * 10 * Math.pow(10, i)) % 10;
s += (digit[d] + fraction[i]).replace(/零./, '');
}
s = s || '整';
num = Math.floor(num);
for (let i = 0; i < unit[0].length && num > 0; i++) {
let p = '';
for (let j = 0; j < unit[1].length && num > 0; j++) {
p = digit[num % 10] + unit[1][j] + p;
num = Math.floor(num / 10);
}
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
}
return s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
}
Python 实现
def to_chinese_amount(n):
if not isinstance(n, (int, float)) or n > 999999999999.99:
return "无效金额"
fraction = ['角', '分']
digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
unit = [['元', '万', '亿'], ['', '拾', '佰', '仟']]
num = abs(n)
s = ''
for i in range(len(fraction)):
digit_val = int(num * 10 * (10 ** i) % 10)
s += (digit[digit_val] + fraction[i]).replace('零.', '')
s = s or '整'
num = int(num)
for i in range(len(unit[0])):
if num <= 0: break
p = ''
for j in range(len(unit[1])):
if num <= 0: break
p = digit[num % 10] + unit[1][j] + p
num = num // 10
s = p.replace('零零', '零').replace('零万', '万') + unit[0][i] + s
return s.replace('零元', '元').replace('零零', '零')
Java 实现
public class AmountConverter {
public static String toChineseAmount(double n) {
if (Double.isNaN(n) || n > 999999999999.99) {
return "无效金额";
}
final String[] fraction = {"角", "分"};
final String[] digit = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
final String[][] unit = {{"元", "万", "亿"}, {"", "拾", "佰", "仟"}};
double num = Math.abs(n);
StringBuilder s = new StringBuilder();
for (int i = 0; i < fraction.length; i++) {
int d = (int) (num * 10 * Math.pow(10, i)) % 10;
s.append(digit[d]).append(fraction[i]);
}
if (s.length() == 0) s.append("整");
long integerPart = (long) num;
for (int i = 0; i < unit[0].length && integerPart > 0; i++) {
StringBuilder p = new StringBuilder();
for (int j = 0; j < unit[1].length && integerPart > 0; j++) {
p.insert(0, digit[(int) (integerPart % 10)] + unit[1][j]);
integerPart /= 10;
}
s.insert(0, p.toString().replaceAll("零$", "") + unit[0][i]);
}
return s.toString().replaceAll("零元", "元").replaceAll("零零", "零").replaceAll("零万", "万");
}
}
Golang 实现
package main
import (
"math"
"strings"
)
func toChineseAmount(n float64) string {
if math.IsNaN(n) || n > 999999999999.99 {
return "无效金额"
}
fraction := []string{"角", "分"}
digit := []string{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}
unit := [][]string{{"元", "万", "亿"}, {"", "拾", "佰", "仟"}}
num := math.Abs(n)
s := ""
for i := 0; i < len(fraction); i++ {
d := int(num*10*math.Pow10(i)) % 10
s += digit[d] + fraction[i]
}
if s == "" { s = "整" }
integerPart := int64(num)
for i := 0; i < len(unit[0]) && integerPart > 0; i++ {
p := ""
for j := 0; j < len(unit[1]) && integerPart > 0; j++ {
p = digit[integerPart%10] + unit[1][j] + p
integerPart /= 10
}
s = p + unit[0][i] + s
}
s = strings.ReplaceAll(s, "零元", "元")
s = strings.ReplaceAll(s, "零零", "零")
s = strings.ReplaceAll(s, "零万", "万")
return s
}