C#数字转汉字

using System;
using System.Collections.Generic;
using System.Text;

public class Utils {
	static void Main(string[] args) {
		Console.WriteLine("100000023:"+Convert2Chinese(100000023));
	}

	// 完成十位以上的数字转换汉字
	public static string Convert2Chinese(int input){
		string ret = null;
		int input2 = Math.Abs(input);
		string resource = "零一二三四五六七八九";
		string unit = "个十百千万亿兆京垓秭穰沟涧正载极";
		if (input > Math.Pow(10, 4 * (unit.Length - unit.IndexOf('万')))) {
			throw new Exception("the input is too big,input:"+input);
		}
		Func<int,List<List<int>>> splitNumFunc = (val) => {
			int i = 0;
			int mod;
			int val_ = val;
			List<List<int>> splits = new List<List<int>>();
			List<int> splitNums ;
			do{
				mod = val_ % 10;
				val_ /= 10;
				if(i % 4 == 0){
					splitNums = new List<int>();
					splitNums.Add(mod);
					if(splits.Count == 0){
						splits.Add(splitNums);
					}else{
						splits.Insert(0,splitNums);
					}
				}else{
					splitNums = splits[0];
					splitNums.Insert(0,mod);
				}
				i++;
			}while(val_ > 0 );
			return splits;
		};
		Func<List<List<int>>,string> hommizationFunc = (data)=>{
			List<StringBuilder> builders = new List<StringBuilder>();
			for (int i = 0; i < data.Count; i++) {
				List<int> data2 = data[i];
				StringBuilder newVal = new StringBuilder();
				for (int j = 0; j < data2.Count;) {
					if(data2[j] == 0){
						int k = j+1;
						for (; k < data2.Count && data2[k] == 0; k++);
						//个位不是0,前面补一个零
						newVal.Append('零');
						j = k;
					}else{
						newVal.Append(resource[data2[j]]).Append(unit[data2.Count-1-j]);
						j++;
					}
				}
				if(newVal[newVal.Length-1] == '零' && newVal.Length > 1){
					newVal.Remove(newVal.Length-1,1);
				}else if(newVal[newVal.Length-1] == '个'){
					newVal.Remove(newVal.Length-1,1);
				}

				if(i==0 && newVal.Length>1 && newVal[0]=='一' && newVal[1]=='十'){//一十 --> 十
					newVal.Remove(0,1);
				}
				builders.Add(newVal);
			}
			StringBuilder sb  = new StringBuilder();
			for (int i = 0; i < builders.Count; i++) {//拼接
				if(builders.Count == 1){//个位数
					sb.Append(builders[i]);
				}else {
					if(i == builders.Count - 1){//万位以下的
						if(builders[i][builders[i].Length -1] != '零'){//十位以上的不拼接"零"
							sb.Append(builders[i]);
						}
					}else{//万位以上的
						if(builders[i][0] != '零'){//零万零亿之类的不拼接
							sb.Append(builders[i]).Append(unit[unit.IndexOf('千')+builders.Count-1-i]);
						}
					}
				}
			}
			return sb.ToString();
		};
		List<List<int>> ret_split = splitNumFunc(input2);
		ret = hommizationFunc(ret_split);
		if (input < 0) ret = "-" + ret;
		return ret;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值