【C# 每日一题4】编程实现题
要求编程实现!大家练练手吧!
输入一个数字,输出汉字的写法!
如:
输入:123456789
输出:一亿两千三百四十五万六千七百八十九
应该有很多方法,大家各抒己见,踊跃参加吧!!
[解决办法]
应该用状态机,最简单。
[解决办法]
- VB code
Selection.NumberFormatLocal = "[DBNum2][$-804]G/通用格式"
[解决办法]
用最笨的方法能做啊 转换字符
[解决办法]
- C# code
public string GetMoney(double dd) { string s = dd.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A"); string d = Regex.Replace(s, @"((?<=-|^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))", "${b}${z}"); string value = Regex.Replace(d, ".", delegate(Match m) { return "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟兆京垓秭穰"[m.Value[0] - '-'].ToString(); }); return value; }Response.Write(GetMoney(123456789));//壹贰仟叁佰肆拾伍陆仟柒佰捌拾玖元
[解决办法]
循环除10取余吧,做进制转换的思路~
[解决办法]
[解决办法]
四个位四个位判断,如果不满四位不加大单位(如亿,万),大于四位数开始加万,加亿
[解决办法]
自己写的java代码,不过还有一点问题,大家可以运行一下,注意包的问题。
- Java code
package edu.xawl.daocao;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class ChangeUpDown{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuffer rs = new StringBuffer(); System.out.println("input a integer:"); while (true) { String str = br.readLine(); if ("bye".equals(str)) break; if (str.length() > 12) { System.out.println("数字过大,请重新输入"); continue; } rs = OK(str); System.out.println(rs); } } static StringBuffer OK(String str) { // 传过来的参数 String diag = str; // sb要来存储转换出来的值 StringBuffer sb = new StringBuffer(); // 堆栈 MyStack ms = new MyStack(); // 用来判断是否加零,比如"100001111",中间有4个零,就判断不加零,并且不写"万"。 int temp = 0; // 这个不用说额吧 String[] hanYuDiag = { "", "十", "百", "千", "万", "亿" }; /** * 数字入栈 */ for (int i = diag.length() - 1; i >= 0; i--) { ms.push(diag.charAt(i) - 48); } /** * 数子出栈,并操作 */ for (int i = ms.getTopAdd(); i >= 0; i--) { // 出来一个数字 //11 10 10 9 9 8 int newDiag = ms.pop(); // 由于是栈,所以从高位出来,最先出来的是最高位的,所以,由于只做到"亿",所以只能有12位,这里是数组,所以下表最大为11 if (i >= 8 && i <= 11) { // 当这个位不为零的时候,老老实实的把你显示出来吧,数字本身转化出来的值连接上它自己的权值 if (newDiag != 0) { sb.append(ChangeUpDown.changeUp(newDiag) + hanYuDiag[i - 8]); } else { // 当这个位等于零的时候,就要分情况讨论了,由于我们知道,如果是0万的话,我们不能显示出来0万。所以... // 判断,在位数在亿位以上时,判断它的下一位是不是零,要是零的话,就结束该层循环,不是零的话 // 往下走 if (i > 8 && ms.top() == 0) { temp++; continue; } // temp要清空,你了解的. if (i == 8 && temp == 3) { temp = 0; continue; } // 显示零 sb.append(ChangeUpDown.changeUp(newDiag)); } // 这里了,当到"亿"位的时候要判断写不写"亿" if (i == 8 && temp != 3) { temp = 0; sb.append(hanYuDiag[5]); } } if (i >= 4 && i <= 7) { if (newDiag != 0) { sb.append(ChangeUpDown.changeUp(newDiag) + hanYuDiag[i - 4]); } else { if (i > 4 && ms.top() == 0) { temp++; continue; } if (i == 4 && temp == 3) { temp = 0; continue; } sb.append(ChangeUpDown.changeUp(newDiag)); } if (i == 4 && temp != 3) { temp = 0; sb.append(hanYuDiag[4]); } } if (i <= 3) { if (newDiag != 0) { sb.append(ChangeUpDown.changeUp(newDiag) + hanYuDiag[i]); } else { if (i > 0 && ms.top() == 0) { continue; } if (i == 0) { continue; } sb.append(ChangeUpDown.changeUp(newDiag)); } } } return sb; } static String changeUp(int n) { String upStr = null; switch (n) { case 1: upStr = "壹"; break; case 2: upStr = "贰"; break; case 3: upStr = "叁"; break; case 4: upStr = "肆"; break; case 5: upStr = "伍"; break; case 6: upStr = "陆"; break; case 7: upStr = "柒"; break; case 8: upStr = "捌"; break; case 9: upStr = "玖"; break; case 0: upStr = "零"; break; default: System.out.println("系统错误!"); } return upStr; }}class MyStack{ private int[] arr = new int[20]; private int index = -1; private int top = 0; public int getTopAdd() { return top; } public void push(int n) { index++; arr[index] = n; top = index; } public int pop() { int n = arr[index]; index--; top = index; return n; } public int top() { // 在这儿应该要加判断是否有元素???? int n = arr[index]; return n; }}
[解决办法]
哈哈,n年前面试做过,人民币小写转大写,面试回来觉得有改进的地方,又重做了一遍,不过不知道有没有错。主要要处理的就是很多0和超过亿后的情况。仅供参考。
- C# code
using System;using System.Collections.Generic;using System.Text;//转换数字金额为人民币大写namespace ConvertMoney{ public class ConvertMoney { /// <summary> /// 是否是浮点数 可带正负号 /// </summary> /// <param name="inputData">输入字符串 </param> /// <returns> </returns> //public static bool IsDecimalSign(string inputData) //{ // Regex RegDecimalSign = new Regex("^[+-]?[0-9]+[.]?[0-9]+$"); // Match m = RegDecimalSign.Match(inputData); // return m.Success; //} static public string convertMoneytoRMB(decimal decMoney) { string strMoney,strOneNum,strTemp,strConverted; int i,iLen; //设初值 strConverted = ""; strMoney = decMoney.ToString(); iLen = strMoney.Length; //先取小数位 if (strMoney.IndexOf(".") > 0) { strTemp = strMoney.Substring(strMoney.IndexOf(".") + 1, strMoney.Length - strMoney.IndexOf(".") - 1); if (strTemp.Length > 2) { Console.WriteLine("错误:无法计算超过2位的小数"); return strConverted; } else if (strTemp == "0" || strTemp == "00" || strTemp == "") strTemp = ""; else { if (strTemp.Length == 1 && strTemp != "0") { strConverted = converNumtoCapital(strTemp) + "角" + strConverted; } else { strOneNum = strTemp.Substring(0, 1); strConverted = converNumtoCapital(strOneNum) + (strOneNum != "0" ? "角" : "") + strConverted; strOneNum = strTemp.Substring(1, 1); strConverted = strConverted + (strOneNum != "0" ? converNumtoCapital(strOneNum) + "分" : ""); } } } //取整数部分 if (strMoney.IndexOf(".") < 0) strTemp = strMoney; else strTemp = strMoney.Substring(0, strMoney.IndexOf(".")); iLen = strTemp.Length; //Console.WriteLine(iLen); Console.WriteLine(strTemp); if (iLen > 0 && decimal.Parse(strTemp) != 0) { strConverted = "元" + strConverted; for (i = 0; i < iLen; ++i) { strOneNum = strTemp.Substring(iLen - 1 - i, 1); //if (strOneNum == "0") //{ // //Console.WriteLine(strConverted.Substring(0, 1)); // if ((strConverted.Substring(0, 1) == "零" || strConverted.Substring(0, 1) == "元" || strConverted.Substring(0, 1) == "万" || strConverted.Substring(0, 1) == "亿") && !((i + 1) % 12 == 0 || (i + 1) == 5 || (i + 1) % 9 == 0)) // continue; // else // strConverted = converNumtoCapital(strOneNum) + strConverted; //} //Console.WriteLine((i + 1) % 4); if ((i + 1) == 1) { strConverted = (strOneNum == "0" ? "" : converNumtoCapital(strOneNum)) + strConverted; } else if (((i + 1) % 4 == 2 || (i + 1) == 2) && i % 4 != 0 && i % 8 != 0) { if (strOneNum == "0") { if (strConverted.Substring(0, 1) == "零" || strConverted.Substring(0, 1) == "元" || strConverted.Substring(0, 1) == "万" || strConverted.Substring(0, 1) == "亿") continue; else strConverted = "零" + strConverted; } else strConverted = converNumtoCapital(strOneNum) + "拾" + strConverted; } else if (((i + 1) % 4 == 3 || (i + 1) == 3) && i % 4 != 0) { if (strOneNum == "0") { if (strConverted.Substring(0, 1) == "零" || strConverted.Substring(0, 1) == "元" || strConverted.Substring(0, 1) == "万" || strConverted.Substring(0, 1) == "亿") continue; else strConverted = "零" + strConverted; } else strConverted = converNumtoCapital(strOneNum) + "佰" + strConverted; } else if ((i + 1) % 4 == 0 && i % 4 != 0) { if (strOneNum == "0") { if (strConverted.Substring(0, 1) == "零" || strConverted.Substring(0, 1) == "元" || strConverted.Substring(0, 1) == "万" || strConverted.Substring(0, 1) == "亿") continue; else strConverted = "零" + strConverted; } else strConverted = converNumtoCapital(strOneNum) + "千" + strConverted; } else if (i % 4 == 0 && i % 8 != 0) { Console.WriteLine("万位{0}", i); strConverted = (strOneNum == "0" ? "" : converNumtoCapital(strOneNum)) + "万" + strConverted; } else if (i % 8 == 0) { Console.WriteLine("亿位{0}", i); if (strConverted.Substring(0, 1) == "万") strConverted = strConverted.Substring(1, strConverted.Length - 1); strConverted = (strOneNum == "0" ? "" : converNumtoCapital(strOneNum)) + "亿" + strConverted; } else { Console.WriteLine(i); strConverted = converNumtoCapital(strOneNum) + strConverted; } } } return strConverted; } static string converNumtoCapital(string strNum) { string strCapital = ""; switch (strNum) { case "0": strCapital = "零"; break; case "1": strCapital = "壹"; break; case "2": strCapital = "贰"; break; case "3": strCapital = "叁"; break; case "4": strCapital = "肆"; break; case "5": strCapital = "伍"; break; case "6": strCapital = "陆"; break; case "7": strCapital = "柒"; break; case "8": strCapital = "捌"; break; case "9": strCapital = "玖"; break; default: strCapital = ""; break; } return strCapital; } } class Program { static void Main(string[] args) { decimal i; string s; while (1 == 1) { Console.WriteLine("输入一个金额(直接回车退出):"); s = Console.ReadLine(); if (s == "") break; //检查金额是否符合规则 try { i = decimal.Parse(s); if (i < 0) throw new Exception("不能是负数"); } catch (Exception e) { Console.WriteLine(e.Message); return; } /* if (!(ConvertMoney.IsDecimalSign(s))) Console.WriteLine("错误:不是金额!"); */ //i = Convert.ToDecimal(s); s = ConvertMoney.convertMoneytoRMB(i); Console.WriteLine("人民币大写金额为:{0}", s); } } }}
[解决办法]
很笨很长的方法,我刚刚入门,其实可以把数44分割进行转换
using System;
using System.Collections.Generic;
using System.Text;
namespace ChangeNumbers
{
class Program
{
static void Main(string[] args)
{
string k;//循环标志
int count = 0;//储存输入数字的位数
int[] intNum;//储存输入数字的每个位的数字
string[] str =new string [] {"壹","贰","叁","肆","伍","陆","柒","捌","玖", "零"};//存储繁体数字
string[] digit = new string[] { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾"};//单位
do
{
Console.WriteLine("请输入你想转化的数字(0-10位):");
string strNum = Console.ReadLine();//读取所输入的数字
int num = Convert.ToInt32(strNum);//转换类型
foreach (char c in strNum)//计算输入数字的位数
{
count++;
}
int j = count;//储存输入数字的位数
intNum = new int[count];//初始化数组的长度为count
for (; 0 < count; count--)//拆分数字并把拆分后的数字存储在intNum中
{
intNum[count - 1] = num % 10; num /= 10;
}
Ling(intNum);//调用Ling方法处理数组中的0
Console.Write("转化后的数字为:");
for (int var = 0; var < intNum.Length;var++ )//访问新数组的每个元素
{
int n=intNum[var];
if ((intNum.Length-var) % 4 == 1)//处理第五位数和第九位数
{
if (n == 0|n==10)
{
if (intNum.Length - var > 7)
n = 20;
else if (intNum.Length - var > 3)
n = 30;
}
}
switch (n)//根据元素转换数字
{
case 0: Console.Write(str[9]); break;
case 1: Console.Write(str[0] + digit[j - 1]); break;
case 2: Console.Write(str[1] + digit[j - 1]); break;
case 3: Console.Write(str[2] + digit[j - 1]); break;
case 4: Console.Write(str[3] + digit[j - 1]); break;
case 5: Console.Write(str[4] + digit[j - 1]); break;
case 6: Console.Write(str[5] + digit[j - 1]); break;
case 7: Console.Write(str[6] + digit[j - 1]); break;
case 8: Console.Write(str[7] + digit[j - 1]); break;
case 9: Console.Write(str[8] + digit[j - 1]); break;
case 10: Console.Write(digit[0]); break;//当数字为10时,打印空字符
case 20: Console.Write(digit[8]); break;//当数字为20时,打印“万”
case 30: Console.Write(digit[4]); break;//当数字为30时,打印“亿”
}
j--;//单位标志
}
Console.WriteLine("\n是否继续输入<y/n>:");
k =Console.ReadLine();
} while (k=="y"||k=="Y");
Console.ReadLine();
}
private static int[] Ling(int[] intNum)//构建处理0的方法
{
int length = intNum.Length-1;
if (intNum[length] == 0)//处理位于输入数字开头的0
{
for (; intNum[length] == 0; length--)
{
intNum[length] = 10;//把开头的0全部转换为10
}
}
for (int i = 1; i < intNum.Length; i++)//处理其他位置的0
{
if (0 == intNum[i] && 0 == intNum[i-1])
{
intNum[i - 1] = 10;//把连续0的地方保留一个0其他转换为10
}
}
return intNum;//返回处理后的数组
}
}
}
[解决办法]
public static string MoneyConverter(double convertedMoney)
{
string money = convertedMoney.ToString();
//找出.的位置
int periodIndex = money.IndexOf('.');
//截取
if(periodIndex>-1)
money = money.Substring(0, periodIndex + 3);
//货币大小写转换
string [] upperMoney=new string[]{"零","壹","贰","叁","肆","五","陆","柒","捌",""};
//货币单位转换
string[] unit = new string[] { "元", "拾", "百", "千", "万", "十万", "百万", "千万", "亿", "十亿", "百亿", "千亿", "万亿"};
string newStr = "";
for (int i = 0; i < money.Length; i++)
{
//当该位置不是'.'所在位置时
if (i != periodIndex)
{
newStr += upperMoney[Convert.ToInt32(money[i].ToString())];
if (periodIndex > -1)
{
if (i < periodIndex)
newStr += unit[(periodIndex - i - 1)];
else
newStr += i - periodIndex == 1 ? '角' : '分';
}
else
newStr += unit[money.Length - i];
}
}
if (periodIndex == -1)
newStr += '整';
return newStr;
}
[解决办法]
上学的时候写过一个,刚才翻出来晒晒
- C# code
[code=C#]class Program { private static string[] intStr = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; private static string[] numStr = new string[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; private static string[] moneyPattern = new string[] { "", "拾", "佰", "仟", "万", "亿" }; static void Main(string[] args) { string money = Console.ReadLine().ToString(); string str=BindMoney(money); Console.WriteLine(str); Console.ReadLine(); } public static string BindMoney(string money) { string str = ""; for (int i = 0; i < money.Length; i++) { for (int j = 0; j < intStr.Length; j++) { if (money.Substring(i,1).Equals(intStr[j])) { str += numStr[j]; } } } str = BindMoneyPattern(str); str = BindMoneyPattern2(str); return str; } private static string BindMoneyPattern(string str) { string moneyStr = ""; for (int i = 0; i < str.Length; i++) { if ((str.Length - i) % 4 == 0) { moneyStr += str[i] + moneyPattern[3]; } else if ((str.Length - i) % 4 == 2) { moneyStr += str[i] + moneyPattern[1]; } else if ((str.Length - i) % 4 == 3) { moneyStr += str[i] + moneyPattern[2]; } else if ((str.Length - i) % 5 == 0) { moneyStr += str[i] + moneyPattern[4]; } else if ((str.Length-i)%9==0) { moneyStr += str[i] + moneyPattern[5]; } else { moneyStr += str[i]; } } return moneyStr; } private static string BindMoneyPattern2(string str) { while (str.Contains("零拾")) { str=str.Replace("零拾","零"); } while (str.Contains("零佰")) { str = str.Replace("零佰", "零"); } while (str.Contains("零仟")) { str = str.Replace("零仟", "零"); } while (str.Contains("零万")) { str = str.Replace("零万","万"); } while (str.Contains("零亿")) { str = str.Replace("零亿", "亿"); } while (str.Contains("亿万")) { str = str.Replace("亿万", "亿"); } while (str.Contains("零零")) { str = str.Replace("零零", "零"); } while (str.IndexOf("零")==str.Length-1) { str = str.Replace("零",""); } return str; } }
[解决办法]
- C# code
public static string MoneyConverter(double convertedMoney) { string money = convertedMoney.ToString(); //找出.的位置 int periodIndex = money.IndexOf('.'); //截取 if(periodIndex>-1) money = money.Substring(0, periodIndex + 3); //货币大小写转换 string [] upperMoney=new string[]{"","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; //货币单位转换 string[] unit = new string[] { "元", "拾", "佰", "仟", "万", "拾万", "百万", "仟万", "亿", "拾亿", "佰亿", "仟亿", "万亿"}; string newStr = ""; for (int i = 0; i < money.Length; i++) { //当该位置不是'.'所在位置时 if (i != periodIndex) { if (money[i] != '0') newStr += upperMoney[Convert.ToInt32(money[i].ToString())]; else if(money[i-1]!='0') newStr += "零"; if (money[i] != '0') { if (periodIndex > -1) { if (i < periodIndex) newStr += unit[(periodIndex - i - 1)]; else newStr += i - periodIndex == 1 ? '角' : '分'; } else newStr += unit[money.Length - i - 1]; } } } if (periodIndex == -1) newStr += "整"; return newStr; }
[解决办法]
刚好前阵时间无聊写过一次
采用弟归处理进位
- VB code
Option Explicit Private Const XXOO As String = "零壹贰叁肆伍陆柒捌玖" Private Const 亿 As Long = 100000000Private Const 万 As Long = 10000Private Const 千 As Long = 1000Private Const 百 As Long = 100Private Const 十 As Long = 10 Private Sub Command1_Click() Dim num As Long num = -1845321601 Debug.Print (ConvertNumber(num))End Sub Private Function ConvertNumber(ByVal n As Long) As String Dim temp As Long Dim str1 As String Dim str2 As String Dim strResult As String Dim b As Boolean If (n < 0) Then b = True n = Abs(n) End If If (n >= 亿) Then str1 = CStr(n) str2 = Right$(str1, 8) str1 = Mid(str1, 1, Len(str1) - 8) temp = CLng(str1) str1 = ConvertNumber(temp) & "亿" temp = CLng(str2) If (temp > 0) And (Mid(str2, 1, 1) = "0") Then str1 = str1 & Left$(XXOO, 1) End If strResult = str1 & ConvertNumber(CLng(temp)) ElseIf (n >= 万) Then str1 = CStr(n) str2 = Right$(str1, 4) str1 = Mid(str1, 1, Len(str1) - 4) temp = CLng(str1) str1 = ConvertNumber(temp) & "万" temp = CLng(str2) If (temp > 0) And (Mid(str2, 1, 1) = "0") Then str1 = str1 & Left$(XXOO, 1) End If strResult = str1 & ConvertNumber(CLng(temp)) ElseIf (n >= 千) Then str1 = CStr(n) str2 = Right$(str1, 3) str1 = Mid(str1, 1, Len(str1) - 3) temp = CLng(str1) str1 = ConvertNumber(temp) & "千" temp = CLng(str2) If (temp > 0) And (Mid(str2, 1, 1) = "0") Then str1 = str1 & Left$(XXOO, 1) End If strResult = str1 & ConvertNumber(CLng(temp)) ElseIf (n >= 百) Then str1 = CStr(n) str2 = Right$(str1, 2) str1 = Mid(str1, 1, Len(str1) - 2) temp = CLng(str1) str1 = ConvertNumber(temp) & "百" temp = CLng(str2) If (temp > 0) And (Mid(str2, 1, 1) = "0") Then str1 = str1 & Left$(XXOO, 1) End If strResult = str1 & ConvertNumber(CLng(temp)) ElseIf (n >= 十) Then str1 = CStr(n) str2 = Right$(str1, 1) str1 = Mid(str1, 1, Len(str1) - 1) temp = CLng(str1) str1 = ConvertNumber(temp) & "十" temp = CLng(str2) If (temp > 0) And (Mid(str2, 1, 1) = "0") Then str1 = str1 & Left$(XXOO, 1) End If strResult = str1 & ConvertNumber(CLng(temp)) Else strResult = Mid(XXOO, n + 1, 1) End If If (b) Then ConvertNumber = "负" & strResult Else ConvertNumber = strResult End IfEnd Function输出结果: 负壹十捌亿肆千伍百叁十贰万壹千陆百零壹本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lorl2/archive/2011/05/13/6418041.aspx
[解决办法]
- C# code
static void Main(string[] args) { Console.WriteLine(ChNum("12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890")); Console.Read(); } static string ChNum(string num) { StringBuilder sb = new StringBuilder(); string CH = "零一二三四五六七八九十百千万亿"; bool isZero=false,isEmpty=true; for (int i = 0; i < num.Length; i++) { int j = (num.Length - i - 1) % 4; if (num[i] != '0') { if (isZero) sb.Append(CH[0]); sb.Append(CH[num[i] - '0']); if (j > 0) sb.Append(CH[j + 9]); isEmpty = false; } if (j == 0) { isZero = false; if(!isEmpty) { j = (num.Length - i - 1) / 4; sb.Append(CH[13],j & 1); sb.Append(CH[14], j >> 1); } isEmpty = true; } else isZero = num[i] == '0'; } return sb.ToString(); }
[解决办法]
提前说明 这个木有带货币单位
- C# code
private static string[] intStr = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; private static string[] numStr = new string[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; private static string[] moneyPattern = new string[] { "", "拾", "佰", "仟", "万", "亿" }; static void Main(string[] args) { for (int i = 0; i < 100; i++) { Console.WriteLine("Plase Write Nums:"); string nums = Console.ReadLine().ToString(); string result=DoReplace(nums); Console.WriteLine(result); } Console.ReadLine(); } private static string DoReplace(string nums) { string str = ""; //判断是否为double类型 if (nums.IndexOf(".") == -1) str = GetInteger(nums); else { string[] strs = nums.Split('.'); str = GetInteger(strs[0])+"点"; str +=GetDecimal(strs[1]); } return str; } //转换整数部分 public static string GetInteger(string nums) { string result = ReplaceNums(nums); result = BindMoneyPattern(result); result = BindMoneyPattern2(result); return result ; } //转换小数部分 public static string GetDecimal(string num) { return ReplaceNums(num); } //替换数字 private static string ReplaceNums(string str) { string result = ""; for (int i = 0; i < str.Length; i++) { for (int j = 0; j < intStr.Length; j++) { if (str.Substring(i, 1).Equals(intStr[j])) { result += numStr[j]; } } } return result; } // 添加万,亿 private static string BindMoneyPattern(string str) { string moneyStr = ""; for (int i = 0; i < str.Length; i++) { if ((str.Length - i) % 4 == 0) { moneyStr += str[i] + moneyPattern[3]; } else if ((str.Length - i) % 4 == 2) { moneyStr += str[i] + moneyPattern[1]; } else if ((str.Length - i) % 4 == 3) { moneyStr += str[i] + moneyPattern[2]; } else if ((str.Length - i) % 5 == 0) { moneyStr += str[i] + moneyPattern[4]; } else if ((str.Length - i) % 9 == 0) { moneyStr += str[i] + moneyPattern[5]; } else { moneyStr += str[i]; } } return moneyStr; } // 去掉零 private static string BindMoneyPattern2(string str) { while (str.Contains("零拾")) { str = str.Replace("零拾", "零"); } while (str.Contains("零佰")) { str = str.Replace("零佰", "零"); } while (str.Contains("零仟")) { str = str.Replace("零仟", "零"); } while (str.Contains("零万")) { str = str.Replace("零万", "万"); } while (str.Contains("零亿")) { str = str.Replace("零亿", "亿"); } while (str.Contains("亿万")) { str = str.Replace("亿万", "亿"); } while (str.Contains("零零")) { str = str.Replace("零零", "零"); } while (str.IndexOf("零") == str.Length - 1) { str = str.Replace("零", ""); } return str; }
[解决办法]
我以前用的类
- C# code
// <summary> /// 金钱转换 /// </summary> /// <param name="num"></param> /// <returns></returns> public static string ConvertToCn(decimal num) { string str1 = "零壹贰叁肆伍陆柒捌玖"; //0-9所对应的汉字 string str2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; //数字位所对应的汉字 string str3 = ""; //从原num值中取出的值 string str4 = ""; //数字的字符串形式 string str5 = ""; //人民币大写金额形式 int i; //循环变量 int j; //num的值乘以100的字符串长度 string ch1 = ""; //数字的汉语读法 string ch2 = ""; //数字位的汉字读法 int nzero = 0; //用来计算连续的零值是几个 int temp; //从原num值中取出的值 num = Math.Round(Math.Abs(num), 2); //将num取绝对值并四舍五入取2位小数 str4 = ((long)(num * 100)).ToString(); //将num乘100并转换成字符串形式 j = str4.Length; //找出最高位 if (j > 15) { return "溢出"; } str2 = str2.Substring(15 - j); //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分 //循环取出每一位需要转换的值 for (i = 0; i < j; i++) { str3 = str4.Substring(i, 1); //取出需转换的某一位的值 temp = Convert.ToInt32(str3); //转换为数字 if (i != (j - 3) && i != (j - 7) && i != (j - 11) && i != (j - 15)) { //当所取位数不为元、万、亿、万亿上的数字时 if (str3 == "0") { ch1 = ""; ch2 = ""; nzero = nzero + 1; } else { if (str3 != "0" && nzero != 0) { ch1 = "零" + str1.Substring(temp * 1, 1); ch2 = str2.Substring(i, 1); nzero = 0; } else { ch1 = str1.Substring(temp * 1, 1); ch2 = str2.Substring(i, 1); nzero = 0; } } } else { //该位是万亿,亿,万,元位等关键位 if (str3 != "0" && nzero != 0) { ch1 = "零" + str1.Substring(temp * 1, 1); ch2 = str2.Substring(i, 1); nzero = 0; } else { if (str3 != "0" && nzero == 0) { ch1 = str1.Substring(temp * 1, 1); ch2 = str2.Substring(i, 1); nzero = 0; } else { if (str3 == "0" && nzero >= 3) { ch1 = ""; ch2 = ""; nzero = nzero + 1; } else { if (j >= 11) { ch1 = ""; nzero = nzero + 1; } else { ch1 = ""; ch2 = str2.Substring(i, 1); nzero = nzero + 1; } } } } } if (i == (j - 11) || i == (j - 3)) { //如果该位是亿位或元位,则必须写上 ch2 = str2.Substring(i, 1); } str5 = str5 + ch1 + ch2; if (i == j - 1 && str3 == "0") { //最后一位(分)为0时,加上“整” str5 = str5; } } if (num == 0) { str5 = "零元"; } return str5; }
[解决办法]
[code=C#][/code]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace SwithTest
{
class Program
{
static void Main(string[] args)
{
string m_Num = "182009848167";
char[] m_charNum = m_Num.ToCharArray();
char[] m_DscChar = new char[m_charNum.Length];
int i = m_charNum.Length - 1;
int k =m_charNum.Length;
string tmp = "";
foreach (char c in m_charNum)
{
double flag = k / 4.0;
if (flag > 4.0)
{
if (k % 4 == 1)
{
tmp += SwithFunc(c);
}
else if (k % 4 == 2)
{
tmp += SwithFunc(c) + "拾";
}
else if (k % 4 == 3)
{
tmp += SwithFunc(c) + "百";
}
else
{
tmp += SwithFunc(c) + "千";
}
}
else if (flag<=4.0 &&flag>3.0)
{
if (flag == 4 && tmp!="")
tmp += "万万亿";
if (k % 4 == 1)
{
tmp += SwithFunc(c);
}
else if (k % 4 == 2)
{
tmp += SwithFunc(c) + "拾";
}
else if (k % 4 == 3)
{
tmp += SwithFunc(c) + "百";
}
else
{
tmp += SwithFunc(c) + "千";
}
}
else if (flag<=3.0&&flag>2.0)
{
if (flag == 3 && tmp != "")
tmp += "万亿";
if (k % 4 == 1)
{
tmp += SwithFunc(c);
}
else if (k % 4 == 2)
{
tmp += SwithFunc(c) + "拾";
}
else if (k % 4 == 3)
{
tmp += SwithFunc(c) + "百";
}
else
{
tmp += SwithFunc(c) + "千";
}
}
else if (flag<=2.0&&flag>1.0)
{
if (flag == 2 && tmp != "")
tmp+="亿";
if (k % 4 == 1)
{
tmp += SwithFunc(c);
}
else if (k % 4 == 2)
{
tmp += SwithFunc(c) + "拾";
}
else if (k % 4 == 3)
{
tmp += SwithFunc(c) + "百";
}
else
{
tmp += SwithFunc(c) + "千";
}
}
else if (flag > 0.0 && flag <= 1.0)
{
if (flag == 1 && tmp != "")
tmp += "万";
if (k % 4 == 1)
{
tmp += SwithFunc(c);
}
else if (k % 4 == 2)
{
tmp += SwithFunc(c) + "拾";
}
else if (k % 4 == 3)
{
tmp += SwithFunc(c) + "百";
}
else
{
tmp += SwithFunc(c) + "千";
}
}
else
{
Console.WriteLine("输入数值太大");
break;
}
k--;
}
Console.WriteLine(tmp);
Thread.Sleep(100000);
}
private static string SwithFunc(char c)
{
string tmp = "";
switch (c)
{
case '0':
tmp = "零";
break;
case'1':
tmp ="壹";
break;
case'2':
tmp = "贰";
break;
case'3':
tmp = "叁";
break;
case'4':
tmp = "肆";
break;
case'5':
tmp = "伍";
break;
case'6':
tmp = "陆";
break;
case'7':
tmp = "柒";
break;
case'8':
tmp = "捌";
break;
case'9':
tmp = "玖";
break;
default:
break;
}
return tmp;
}
}
}
有没有比这个更笨的方法
PS 求去掉重复零的简易方法;
[解决办法]
与65类似
一步步来,处理万亿内整数
- C# code
private string convert(string num) { double d = Convert.ToDouble(num); num = num.TrimStart('0'); if (num=="") { return "零元"; } string result = ""; if (txtIn.Text.IndexOf('.') < 0) { for (int i = 0; i < num.Length; i++) { result += getdw(num.Substring(i, 1), num.Length - i); } } // result = replace(result, "零拾", "零"); result = replace(result, "零佰", "零"); result = replace(result, "零千", "零"); result = replace(result, "零万", "万"); result = replace(result, "零亿", "亿"); result = replace(result, "亿万", "亿"); result = replace(result, "零零", "零"); result = result.TrimEnd('零')+"元"; return result; } private string getdx(string num) { int ind = int.Parse(num); string[] sz = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; return sz[ind]; } private string getdw(string num, int ind) { string[] dw = { "", "", "拾", "佰", "千", "万", "拾", "佰", "千", "亿", "拾", "佰", "千", "万"}; return getdx(num)+dw[ind]; } private string replace(string str,string str0,string str1) { while (str.IndexOf(str0)>0) { str = str.Replace(str0, str1); } return str; }
[解决办法]
- C# code
protected List<string> change(string val) { List<string> vals=new List<string>(); int i=0; while (i < val.Length) { vals.Add(val.Substring(i, 1)); i++; } string[] numStr = new string[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; string[] moneyPattern = new string[] { "", "拾", "佰", "仟", "万", "亿" }; List<string > values = new List<string >(); int k; int j; for ( j = vals.Count ,k=0; j >0 ; j--,k++) { switch (get(j)) { case 1: { if (j == 1) { values.Add(vals[k].ToString() != "0" ? (numStr[Convert.ToInt32(vals[k].ToString())] + moneyPattern[j - 1]) : ""); } else { if (vals[k].ToString() == "0" && vals[k + 1].ToString() == "0") { values.Add(""); } else if (vals[k].ToString() == "0" && vals[k + 1].ToString() != "0") { values.Add("零"); } else { values.Add(numStr[Convert.ToInt32(vals[k].ToString())] + moneyPattern[j - 1]); } } } break; case 2: { if (j == 5) { values.Add(vals[k].ToString() != "0" ? (numStr[Convert.ToInt32(vals[k].ToString())] + moneyPattern[j - 5] + moneyPattern[j - 1]) : moneyPattern[j - 1]); } else { if (vals[k].ToString() == "0" && vals[k + 1].ToString() == "0") { values.Add(""); } else if (vals[k].ToString() == "0" && vals[k + 1].ToString() != "0") { values.Add("零"); } else { values.Add(numStr[Convert.ToInt32(vals[k].ToString())] + moneyPattern[j - 5].ToString()); } } } break; case 3: { if (j == 9) { values.Add(vals[k].ToString() != "0" ? (numStr[Convert.ToInt32(vals[k].ToString())] + moneyPattern[j - 9] + moneyPattern[j - 4]) : moneyPattern[j - 4]); } else { if (vals[k].ToString() == "0" && vals[k + 1].ToString() == "0") { values.Add(""); } else if (vals[k].ToString() == "0" && vals[k + 1].ToString() != "0") { values.Add("零"); } else { values.Add(numStr[Convert.ToInt32(vals[k].ToString())] + moneyPattern[j - 9].ToString()); } } } break; default: break; } } return values; } int get(int j) { if (j <= 4) return 1; else if (j > 4 && j <= 8) return 2; else if (j > 8 && j <= 12) return 3; else return 4; }
[解决办法]
[解决办法]
应该弄成通用点的,比如说31415926后面30几个0, 怎么办?
个人考虑“亿”为最终单位,千万以前都为基本单位,虽然麻烦点,但觉得通用性能强一些也更符合楼主要求。
拆分字符串,转换大小写,按位插入对应的“万”还是“亿”。
个人觉得数字应该和后面的位标志分开来看。