C#将数字自动翻译为中文,比如

数字1234 , 翻译为 一千二百三十四

数字56789 , 翻译为 五万六千七百八十九

思路:

我们可以使用递归的方式,化整为零法,把复杂的数字 分割,使其简单化。

比如数字 【12 3456 7890】,我们可以按照万为单位 ,划分三个独自区间 12亿,3456万,7890

那么 我们只用处理 四位数字即可,范围 【0~9999】,那么我们只用处理千、百、十、个。

比如 4567,我们按照 4567/1000 以及 4567%1000 【商和余数】独自处理。以及类推,直到只处理个位就结束。

新建窗体应用程序NumberToChineseDemo,默认窗体Form1重命名为FormNumberToChinese

窗体FormNumberToChinese设计如下:

新建关键处理类NumberChineseTranslateUtil.cs,

NumberChineseTranslateUtil源代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace NumberToChineseDemo
{/// <summary>/// 数字与中文描述转化示例/// </summary>public class NumberChineseTranslateUtil{/// <summary>/// 中文字符描述集合/// 十索引为10/// 百索引为11/// 千索引为12/// 万索引为13/// 亿索引为14/// </summary>static readonly char[] ChineseCollection = new char[] { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九','十','百','千','万','亿' };/// <summary>/// 数字转中文/// 按照【个、十、百、千、万、亿】/// 只考虑正整数和零/// </summary>/// <param name="number"></param>/// <returns></returns>public static string NumberToChinese(int number){//商和余数int quotient = 0;//商int remainder = 0;//余数number = Math.Abs(number);if (number < 10){//0~9return ChineseCollection[number].ToString();}if (number < 100){//10~99之间quotient = number / 10;remainder = number % 10;//考虑到 余数为0时特殊处理return ChineseCollection[quotient].ToString() + ChineseCollection[10] + (remainder == 0 ? "" : ChineseCollection[remainder].ToString());}if (number < 1000){//100~999quotient = number / 100;remainder = number % 100;if (remainder == 0){//比如300return ChineseCollection[quotient].ToString() + ChineseCollection[11];}string handleRemainder = "";if (remainder > 0 && remainder < 10){handleRemainder = ChineseCollection[0].ToString();//加上零 如 502}return ChineseCollection[quotient].ToString() + ChineseCollection[11] + handleRemainder + NumberToChinese(remainder);}if (number < 10000){//1000~9999quotient = number / 1000;remainder = number % 1000;if (remainder == 0){//比如300return ChineseCollection[quotient].ToString() + ChineseCollection[12];}string handleRemainder = "";if (remainder > 0 && remainder < 100){handleRemainder = ChineseCollection[0].ToString();//加上零 如 502}return ChineseCollection[quotient].ToString() + ChineseCollection[12] + handleRemainder + NumberToChinese(remainder);}if (number < 100000000){//10000~9999 9999quotient = number / 10000;remainder = number % 10000;if (remainder == 0){//比如300return NumberToChinese(quotient) + ChineseCollection[13];}string handleRemainder = "";if (remainder > 0 && remainder < 1000){handleRemainder = ChineseCollection[0].ToString();//加上零 如 502}return NumberToChinese(quotient) + ChineseCollection[13] + handleRemainder + NumberToChinese(remainder);}else{//一亿或以上quotient = number / 100000000;remainder = number % 100000000;if (remainder == 0){//比如300return NumberToChinese(quotient) + ChineseCollection[14];}string handleRemainder = "";if (remainder > 0 && remainder < 1000){handleRemainder = ChineseCollection[0].ToString();//加上零 如 502}return NumberToChinese(quotient) + ChineseCollection[14] + handleRemainder + NumberToChinese(remainder);}}/// <summary>/// 数字转中文/// 考虑负数 和 正数/// </summary>/// <param name="number"></param>/// <returns></returns>public static string NumberToChineseEx(int number){if (number < 0){return "负" + NumberToChinese(number);}return NumberToChinese(number);}/// <summary>/// 中文转数字/// 只考虑正整数的情况/// </summary>/// <param name="chinese"></param>/// <returns></returns>public static int ChineseToNumber(string chinese){if (chinese == "零"){return 0;}int number = 0;int hundredMillionIndex = chinese.IndexOf('亿');//100个百万就是一亿int tenThousandIndex = chinese.IndexOf('万');//10个千就是一万if (hundredMillionIndex >= 0 && tenThousandIndex >= 0 && tenThousandIndex < hundredMillionIndex){//不支持万亿或以上throw new Exception($"不支持的表达式中文表达式太大了,确保不超过21亿");}if (hundredMillionIndex == -1 && tenThousandIndex == -1){//如果不存在亿 和 万,说明是低于 10000 即 0~9999chinese = chinese.Replace("零", "");//移除所有的零int thousandIndex = chinese.IndexOf('千');int hundredIndex = chinese.IndexOf('百');int tenIndex = chinese.IndexOf('十');if (thousandIndex >= 0){//找出千的前一个字符int thousandNumber = Array.IndexOf(ChineseCollection, chinese[thousandIndex - 1]);if (thousandNumber == -1){throw new Exception($"非法的中文表达式,表达式中间不能有空格或存在非法字符.【{chinese}】");}number += thousandNumber * 1000;}if (hundredIndex >= 0){//找出百的前一个字符int hundredNumber = Array.IndexOf(ChineseCollection, chinese[hundredIndex - 1]);if (hundredNumber == -1){throw new Exception($"非法的中文表达式,表达式中间不能有空格或存在非法字符.【{chinese}】");}number += hundredNumber * 100;}if (tenIndex >= 0){//找出十的前一个字符int tenNumber = Array.IndexOf(ChineseCollection, chinese[tenIndex - 1]);if (tenNumber == -1){throw new Exception($"非法的中文表达式,.【{chinese}】");}number += tenNumber * 10;}//如果【个位数】最后一个数,不是千、百、十char lastChar = chinese[chinese.Length - 1];if (lastChar != '千' && lastChar != '百' && lastChar != '十'){int singleDigit = Array.IndexOf(ChineseCollection, lastChar);//个位数if (singleDigit == -1){throw new Exception($"非法的中文表达式,表达式中间不能有空格或存在非法字符.【{chinese}】");}number += singleDigit;}}else if (hundredMillionIndex >= 0 && tenThousandIndex == -1){//存在 亿,不存在 万,分两部分独自处理.每一部分都小于一万string hundredMillionPart = chinese.Substring(0, hundredMillionIndex);int leftNumber = ChineseToNumber(hundredMillionPart);if (leftNumber > 21){throw new Exception($"不能超过21亿,不支持的表达式.【{chinese}】");}number += leftNumber * 100000000;if (hundredMillionIndex + 1 < chinese.Length){string tailPart = chinese.Substring(hundredMillionIndex + 1);//余下的部分number += ChineseToNumber(tailPart);}}else if (hundredMillionIndex == -1 && tenThousandIndex >= 0){//不存在 亿,存在 万string tenThousandPart = chinese.Substring(0, tenThousandIndex);int leftNumber = ChineseToNumber(tenThousandPart);number += leftNumber * 10000;if (tenThousandIndex + 1 < chinese.Length){string tailPart = chinese.Substring(tenThousandIndex + 1);//余下的部分number += ChineseToNumber(tailPart);}}else{//如果同时存在亿 和 万.那么分成三部分string hundredMillionPart = chinese.Substring(0, hundredMillionIndex);int leftNumber = ChineseToNumber(hundredMillionPart);if (leftNumber > 21){throw new Exception($"不能超过21亿,不支持的表达式.【{chinese}】");}number += leftNumber * 100000000;//亿的部分string tenThousandPart = chinese.Substring(hundredMillionIndex + 1, tenThousandIndex - hundredMillionIndex - 1);int middleNumber = ChineseToNumber(tenThousandPart);number += middleNumber * 10000;//万的部分if (tenThousandIndex + 1 < chinese.Length){string tailPart = chinese.Substring(tenThousandIndex + 1);//余下的部分number += ChineseToNumber(tailPart);}}return number;}/// <summary>/// 中文转数字/// 考虑负数 和 正数/// </summary>/// <param name="chinese"></param>/// <returns></returns>public static int ChineseToNumberEx(string chinese){int multiple = 1;if (chinese.StartsWith("负")){chinese = chinese.Substring(1);multiple = -1;}return multiple * ChineseToNumber(chinese);}}
}

窗体FormNumberToChinese主要程序如下(忽略设计器自动生成的代码):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace NumberToChineseDemo
{public partial class FormNumberToChinese : Form{public FormNumberToChinese(){InitializeComponent();}private void btnNumberToChinese_Click(object sender, EventArgs e){txbDestChinese.Clear();if (txbSrcNumber.Text.Trim().Length == 0){txbSrcNumber.Focus();MessageBox.Show($"请输入数字", "出错");return;}int number;if (!int.TryParse(txbSrcNumber.Text, out number)){txbSrcNumber.Focus();MessageBox.Show($"请输入整数", "出错");return;}try{txbDestChinese.Text = NumberChineseTranslateUtil.NumberToChineseEx(number);}catch (Exception ex){MessageBox.Show($"出现异常:【{ex.Message}】", "转化出错");}}private void btnChineseToNumber_Click(object sender, EventArgs e){txbDestNumber.Clear();string chinese = txbSrcChinese.Text.Trim();if (chinese.Length == 0){txbSrcChinese.Focus();MessageBox.Show($"请输入中文", "出错");return;}try{txbDestNumber.Text = NumberChineseTranslateUtil.ChineseToNumberEx(chinese).ToString();}catch (Exception ex){MessageBox.Show($"出现异常:【{ex.Message}】", "转化出错");}}}
}

测试效果如图:

C#将数字自动翻译为中文相关推荐

  1. C#将数字自动翻译为中文,使用循环迭代的方式

    上一篇我们使用递归的方式将数字自动翻译(转化为中文) C#将数字自动翻译为中文_斯内科的博客-CSDN博客 这次我们使用循环迭代的方式. 思路(除基取余迭代法): 以数字4567为例,首先除以1000 ...

  2. python将数字转变为中文读法-Python转换数字到中文大写格式

    今天有人在群里问到Python怎么把小写数字转换成中文的大写字符,觉得这个问题很有趣,于是想了一下,就开始写代码了. 以下是代码,感觉不足的地方就是如果是1001元,那么就会转换成 壹仟零佰零拾壹圆, ...

  3. 中文格式_财务必会Excel技巧,将数字转换成中文的5种方式

    你还在纠结如何把数字转换成中文大小写吗?下面和大家一起来学习把数字转换成中文的5种方法. 方式一:NUMBERSTRING函数 语法=NUMBERSTRING(数值,选项) 数值:被转换为中文字符串的 ...

  4. VB:将数字转换为大写中文

    方法1: 程序代码: Const strN = "零壹贰叁肆伍陆柒捌玖" Const strG = "拾佰仟万亿" Const intN = "012 ...

  5. js将数字转换成中文大写

    //完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五.const toChinesNum = ( ...

  6. JS 实现数字转换为大写中文金额

    数字转换为大写中文金额 function convertCurrency(money) { //汉字的数字 var cnNums = new Array('零', '壹', '贰', '叁', '肆' ...

  7. ubuntu18.04自带的输入法数字键选择出现数字而不是中文

    ubuntu自带的输入法出了故障,输入中文的时候,用数字键选择会出现数字,而不是数字对应的中文 ubuntu自带的输入法(IBUS)出了故障,当你突然之间发现输入中文的时候,用数字键选择会出现数字,而 ...

  8. C语言-如何将用户输入的金额数字转换成中文大写?

    实战: 如何将用户输入的金额数字转换成中文大写? #include <stdio.h>int main() {// 输入金额转换成大写int money; // 输入数字int money ...

  9. 金钱数字转换为大写中文

    效果图如下:  private void zhuanhuan_Click(object sender, EventArgs e)         {                         ...

最新文章

  1. 抢先体验微软最新客户端系统Windows 8.1!
  2. java IO流面试总结
  3. TCP系列42—拥塞控制—5、Linux中的慢启动和拥塞避免(二)
  4. 华科计算机复试考什么,华科计算机复试的机试
  5. WPF窗体隐藏鼠标光标的方法
  6. 【图像融合】简单加权融合
  7. matlab whos命令
  8. 高速理解掌握node.js 字符编码,确码过程 以及base64编解码原理
  9. 字符串匹配算法KMP详解
  10. joc杂志影响因子2019_2019年4月1日 部分化学期刊即时影响因子预测(仅供参考)...
  11. 技法(但请少用):为非活动窗口绘制活动的标题栏
  12. 一行代码实现蒲公英市场APP检查更新
  13. 数据库(MySQL)基础
  14. 一日一技python安装_一日一技:快速实现Python 命令行参数
  15. 时隙ALOHA(S-ALOHA)算法的实现及其性能分析
  16. ffmpeg h264文件转mp4
  17. 迪赛智慧数——柱状图(基本柱状图):1994-2022年历届世界杯投入资金
  18. 由于短期理财基金到期的最后一天是按活期利率盘算
  19. 多重引导的另一种方法
  20. 铨顺宏RFID:服饰行业和店铺管理与解决方法是如何利用RFID技术

热门文章

  1. MATLAB-三维柱状图
  2. native、方法区
  3. SVN服务器管理工具——VisualSVN Server Manager
  4. openpose环境搭建(全教程)
  5. IntelliJ IDEA汉化,IntelliJ IDEA安装中文语言包。IntelliJ IDEA 2020.1正式发布,支持中文啦。
  6. 铁姆肯公司收购Aurora轴承公司
  7. Python爬虫代理IP(代理池)——加载和使用
  8. Flink实操 : DataSource操作
  9. 敲简单前端小游戏——贪吃蛇
  10. 命令行把java项目打成jar包