using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Data; namespace System.Windows.Controls { [ValueConversion(typeof(string), typeof(string))] public class NumberToChineseConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string valueString = value.ToString(); decimal num = 0; if (!decimal.TryParse(valueString, out num)) { return DependencyProperty.UnsetValue; } string[] tmp_Array = num.ToString().Split(new char[] { '.' }, StringSplitOptions.None); // 这个是小数点前的数字 string beforeDecimalPoint = tmp_Array[0]; // 这个是小数点后的数字 string afterDecimalPoint = tmp_Array.Length > 1 ? tmp_Array[1] : string.Empty; // 先将数字四位为一组分别放到一个List中 List<ChineseNum> beforeDecimalPointGroup = new List<ChineseNum>(); int maxIndex = beforeDecimalPoint.Length - 1; int count = 0; string tmpValue = string.Empty; for (var n = maxIndex; n >= 0; n--) { tmpValue = string.Format("{0}{1}", beforeDecimalPoint[n].ToString(), tmpValue); if (count == 3 || n == 0) { var number = new ChineseNum() { UnitIndex = beforeDecimalPointGroup.Count, Number = tmpValue }; beforeDecimalPointGroup.Add(number); count = 0; tmpValue = string.Empty; } else { count++; } } string result = string.Empty; var tmp = beforeDecimalPointGroup.OrderBy(c => c.UnitIndex); // 将每4位的数字组合起来 foreach (var a in tmp) { result = string.Format("{1}{0}", result, a.Value); } // 整合小数部分 if (!string.IsNullOrEmpty(afterDecimalPoint)) { // 增加点 result = string.Format("{0}{1}", result, "点"); // 整合每个位置上得小数 for (var n = 0; n < afterDecimalPoint.Length; n++) { result = string.Format("{0}{1}", result, GetNumber(int.Parse(afterDecimalPoint[n].ToString()))); } } return result; } static string GetNumber(int n) { string num = string.Empty; switch (n) { case 0: num = "零"; break; case 1: num = "壹"; break; case 2: num = "贰"; break; case 3: num = "叁"; break; case 4: num = "肆"; break; case 5: num = "伍"; break; case 6: num = "陆"; break; case 7: num = "柒"; break; case 8: num = "捌"; break; case 9: num = "玖"; break; default: break; } return num; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } public class ChineseNum { public int UnitIndex { get; set; } public string Number { get; set; } public string Value { get { // 当只有一个0时,返回0,此例仅适用于数字0 if (Number == "0") { return PlaceHolder; } // 当只具备0时,该四位数字不需要显示 if (string.IsNullOrEmpty(Number.Trim(new char[] { '0' }))) { return string.Empty; } else // 当具备其他数字时,组合中文大写数字 { string value = string.Empty; for (var n = 0; n < Number.Length; n++) { value = string.Format("{0}{1}{2}", value, GetNumber(n), GetUnit(n)); } // 组合当前4位数所在的单位 return string.Format("{0}{1}", value, UnitValue(UnitIndex)); } } } public string PlaceHolder { get { return "零"; } } string GetNumber(int index) { var n = int.Parse(Number[index].ToString()); string num = string.Empty; // 当0为最后一位时 或者当下一位也为0时 不显示该位 if (n == 0 && ((Number.Length == index + 1) || Number[index + 1] == '0')) { return num; } switch (n) { case 0: num = "零"; break; case 1: num = "壹"; break; case 2: num = "贰"; break; case 3: num = "叁"; break; case 4: num = "肆"; break; case 5: num = "伍"; break; case 6: num = "陆"; break; case 7: num = "柒"; break; case 8: num = "捌"; break; case 9: num = "玖"; break; default: break; } return num; } /// <summary> /// 获取当前位置上得数字的中文大写单位 /// </summary> /// <param name="index"></param> /// <returns></returns> string GetUnit(int index) { string unit = string.Empty; int unitIndex = Number.Length - index; if (Number[index] == '0') return unit; switch (unitIndex) { case 4: unit = "千"; break; case 3: unit = "百"; break; case 2: unit = "拾"; break; } return unit; } string UnitValue(int index) { string unit = string.Empty; switch (index) { case 1: unit = "万"; break; case 2: unit = "亿"; break; case 3: unit = "兆"; break; case 4: unit = "京"; break; case 5: unit = "垓"; break; case 6: unit = "秭"; break; default: break; } return unit; } } }
Number: 12345
Chinese: 壹万贰千叁百肆拾伍