C# 数字转中文(支持正负数、小数)

将数字转化为中文文字是一种常见的转换,主要用于文档或者数据的可读性更强。应用场景包括汇报、文档、表格等。
由于中文数字表达相对复杂,单位有个位、十位、百位、千位、万位、亿位等,要注意不同单位之间的转换关系。

实现思路
这个函数的实现思路是:
将数字转换为字符串。
判断字符串是否包含小数点,如果有,则分离出整数部分和小数部分。
分别调用 ConvertInteger 和 ConvertDecimal 函数将整数部分和小数部分转换为中文。
将转换后的整数部分和小数部分拼接起来,并根据原来的数字是正数还是负数,在开头添加"正"或"负"。

实现过程
下面是每个步骤的具体实现过程:
步骤 1:将数字转换为字符串
使用 ToString 方法将数字转换为字符串。
步骤 2:分离整数部分和小数部分
使用 IndexOf 方法查找字符串中小数点的位置。如果找到了小数点,则使用 Substring 方法分离出整数部分和小数部分。
步骤 3:调用 ConvertInteger 和 ConvertDecimal 函数
分别调用 ConvertInteger 和 ConvertDecimal 函数,将整数部分和小数部分转换为中文。
步骤 4:拼接结果
将转换后的整数部分和小数部分拼接起来,并根据原来的数字是正数还是负数,在开头添加"正"或"负"。

实现原理
在实现过程中,这个函数使用了两个辅助函数 ConvertInteger 和 ConvertDecimal,分别用于将整数和小数转换为中文。
ConvertInteger 函数
ConvertInteger 函数的作用是将整数转换为中文。
它的实现过程如下:
删除数字字符串开头的0。
如果数字字符串为空,则直接返回"零"。
遍历每一位数字。
如果当前位数字为0,则判断是否是最后一位,或者是否前面已经添加过数字。如果是,则将"零"添加到结果字符串中。
 如果当前位数字不为0,则添加当前位数字的中文表示和数位的中文表示到结果字符串中。
返回结果字符串。
ConvertInteger 函数通过遍历每一位数字,并根据数字的大小和数位的不同,添加不同的中文表示,最终得到整数的中文表示。
ConvertDecimal 函数
ConvertDecimal 函数的作用是将小数转换为中文。
它的实现过程如下:
遍历每一位小数。
如果当前位数字不为0,则添加当前位数字的中文表示和数位的中文表示到结果字符串中。
如果小数部分全部为0,则添加"零"到结果字符串中。
返回结果字符串。
ConvertDecimal 函数通过遍历每一位小数,并根据数字的大小和数位的不同,添加不同的中文表示,最终得到小数的中文表示。

总结
这个函数使用了两个辅助函数 `Convert

-----代码开始-----
using System;
using System.Collections.Generic;
using System.Text;
namespace NumberToChinese
{
    public static class NumberToChinese
    {
        // 定义中文数字
        private static readonly string[] ChineseNumbers =
        {
"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"
};
        // 定义中文数位
        private static readonly string[] ChineseDigits =
        {
"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千"
};
        // 将数字转换为中文
        public static string Convert(double number)
        {
            // 如果数字为负数,则转换为正数并添加"负"
            bool isNegative = false;
            if (number < 0)
            {
                isNegative = true;
                number = -number;
            }
            // 将数字转换为字符串
            string strNumber = number.ToString();
            // 获取小数点位置
            int dotPos = strNumber.IndexOf('.');
            if (dotPos < 0)
            {
                // 数字是整数,直接转换
                return (isNegative ? "负" : "") + ConvertInteger(strNumber);
            }
            else
            {
                // 数字是小数,分离整数部分和小数部分
                string intPart = strNumber.Substring(0, dotPos);
                string decPart = strNumber.Substring(dotPos + 1);
                // 转换整数部分和小数部分
                return (isNegative ? "负" : "") + ConvertInteger(intPart) + "点" + ConvertDecimal(decPart);
            }
        }
        // 将整数转换为中文
        private static string ConvertInteger(string intStr)
        {
            // 去掉首部的0
            intStr = intStr.TrimStart('0');
            // 如果整数为0,则直接返回"零"
            if (intStr.Length == 0)
            {
                return "零";
            }
            // 定义结果字符串
            StringBuilder sb = new StringBuilder();
            // 遍历每一位数字
            for (int i = 0; i < intStr.Length; i++)
            {
                // 获取当前位的数字
                int digit = intStr[i] - '0';
                // 如果当前位不是最后一位,且数字为0,则只添加"零"
                if (digit == 0 && i != intStr.Length - 1)
                {
                    sb.Append("零");
                    continue;
                }
                // 添加当前位的数字和数位
                sb.Append(ChineseNumbers[digit]);
                sb.Append(ChineseDigits[intStr.Length - 1 - i]);
            }
            // 返回结果
            return sb.ToString();
        }
        // 将小数转换为中文
        private static string ConvertDecimal(string decStr)
        {
            // 定义结果字符串
            StringBuilder sb = new StringBuilder();
            // 遍历每一位小数
            for (int i = 0; i < decStr.Length; i++)
            {
                // 获取当前位的数字
                int digit = decStr[i] - '0';
                // 如果数字不为0,则添加数字和数位
                if (digit != 0)
                {
                    sb.Append(ChineseNumbers[digit]);
                    sb.Append(ChineseDigits[-i - 1]);
                }
            }
            // 如果小数部分全部为0,则添加"零"
            if (sb.Length == 0)
            {
                sb.Append("零");
            }
            // 返回结果
            return sb.ToString();
        }
    }
}
-----代码结束-----

以上代码实现了一个能够将数字转换为中文的文本的函数,在功能上有以下优势:
能够处理正负数:函数能够识别输入的数字是正数还是负数,并在结果中添加"正"或"负"。
能够处理小数:函数能够将小数转换为中文,并将小数点转换为"点"。
能够处理数字的每一位:函数能够将数字的每一位转换为中文,并根据数位的不同添加相应的中文表示。
这个函数的实现思路清晰,代码结构清晰,使用了两个辅助函数,方便代码的维护和扩展。
 

猜你喜欢

转载自blog.csdn.net/zcr_59186/article/details/128552684
今日推荐