求个中文大写数字转换成阿拉伯数字的函数

wstar 2008-06-16 08:51:47
找了半天没有,都是阿拉伯数字转换成中文大写数字的........
就是要把 零一二三四五六七八九十百千 组合的转换成为 相应数字 也不是会计用的那种大写

如 一千一百九十 转换成为 1190
...全文
1321 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
-过客- 2008-06-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wstar 的回复:]
我找了半天 只有下面这个 但是只能转换九十九以内的 哪位大侠来个全的 我觉得这种需求网上应该有呀 自己干写可太累了 实在没有我也只好自己写了...........
[/Quote]

自己干写可太累了
-----------------
楼主的这种态度让人看着有些不爽,自己写累,难道别人写就不累了吗?

实在没有我也只好自己写了...........
-----------------
即然自己能写出来,又何必为此去求人呢,自己思考过,试验过,搜索过相关资源,实在写不出了,再去找别人帮忙,才会使自己收获更多,而不仅仅是个答案而已

在下面帖子里11楼写过一个类似的方法,但因为是针对那个帖子的问题写的,所以可能并不完全适合楼主的要求,楼主测下吧,如果有哪里不符合的,提出来,我再改下
求地址字符串总大写数字装换为阿拉伯数字的函数,在线等待!
阿牛138588 2008-06-17
  • 打赏
  • 举报
回复
大概思路是,从左往右取数
如:拾亿零二十万三仟伍佰陆拾元叁角
取数以(亿、万、仟、佰、十...依次下来)
拾亿=1000000000
零二十万=200000
三仟=3000
伍佰=500
拾元=10
参角=0.3
所有数字相加就行了

王集鹄 2008-06-17
  • 打赏
  • 举报
回复
public double DecodeMoneyCn(string AText)
{
AText = AText.Replace("亿亿", "兆");
AText = AText.Replace("万万", "亿");
AText = AText.Replace("点", "元");
AText = AText.Replace("块", "元");
AText = AText.Replace("毛", "角");
double vResult = 0;
double vNumber = 0; // 当前数字
double vTemp = 0;
int vDecimal = 0; // 是否出现小数点
foreach (char vChar in AText)
{
int i = "零一二三四五六七八九".IndexOf(vChar);
if (i < 0) i = "洞幺两三四五六拐八勾".IndexOf(vChar);
if (i < 0) i = "零壹贰叁肆伍陆柒捌玖".IndexOf(vChar);
if (i > 0)
{
vNumber = i;
if (vDecimal > 0)
{
vResult += vNumber * Math.Pow(10, -vDecimal);
vDecimal++;
vNumber = 0;
}
}
else
{
i = "元十百千万亿".IndexOf(vChar);
if (i < 0) i = "整拾佰仟万亿兆".IndexOf(vChar);
if (i == 5) i = 8;
if (i == 6) i = 12;
if (i > 0)
{
if (i >= 4)
{
vTemp += vNumber;
if (vTemp == 0) vTemp = 1;
vResult += vTemp * Math.Pow(10, i);
vTemp = 0;
}
else vTemp += vNumber * Math.Pow(10, i);
}
else
{
i = "元角分".IndexOf(vChar);
if (i > 0)
{
vTemp += vNumber;
vResult += vTemp * Math.Pow(10, -i);
vTemp = 0;
}
else if (i == 0)
{
vTemp += vNumber;
vResult += vTemp;
vDecimal = 1;
vTemp = 0;
}
}
vNumber = 0;
}
}
return vResult + vTemp + vNumber;
}

private void button1_Click(object sender, EventArgs e)
{
string[] vTestText = {
"十二点五六",
"一亿零一万零五",
"四万万",
"九十八亿七千六百五十四万三千二百一十",
"五元一角四分", "壹佰元整",
"三千五百万",
"九块二毛"};
foreach (string vText in vTestText)
{
Console.WriteLine("DecodeMoneyCn(\"{0}\")={1}", vText,
DecodeMoneyCn(vText));
}

//输出
//DecodeMoneyCn("十二点五六")=2.56
//DecodeMoneyCn("一亿零一万零五")=100010005
//DecodeMoneyCn("四万万")=400000000
//DecodeMoneyCn("九十八亿七千六百五十四万三千二百一十")=9876543210
//DecodeMoneyCn("五元一角四分")=5.14
//DecodeMoneyCn("壹佰元整")=100
//DecodeMoneyCn("三千五百万")=35000000
//DecodeMoneyCn("九块二毛")=9.2
//DecodeMoneyCn("一兆")=1000000000000
}
fishidea 2008-06-17
  • 打赏
  • 举报
回复
帮顶,敬佩原创...致敬~
yagebu1983 2008-06-17
  • 打赏
  • 举报
回复
帮你顶!!
wstar 2008-06-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lxcnn 的回复:]
引用 6 楼 wstar 的回复:
我找了半天 只有下面这个 但是只能转换九十九以内的 哪位大侠来个全的 我觉得这种需求网上应该有呀 自己干写可太累了 实在没有我也只好自己写了...........


自己干写可太累了
-----------------
楼主的这种态度让人看着有些不爽,自己写累,难道别人写就不累了吗?

实在没有我也只好自己写了...........
-----------------
即然自…
[/Quote]

误解我的意思了,我是说如网上有公用函数,且非常简练,绝对比自己写得好,而且还能学习并收藏起来
这个模块只是我程序的一小部分,绝对没有偷懒的意思....... 有类似的我会自己改的 呵呵
alex_pang333 2008-06-16
  • 打赏
  • 举报
回复
我给个思路吧,建一个hashTable或者一个枚举,hashTable中键是中文字符,值是阿拉伯数字;枚举的话对应的值顺序为十进制数字;每次从中文字符末尾读取一个字符并且指出当前字符的倒数位置i,找到对应的阿拉伯数字m,值为sum=m*10^i+m;直到字符串的开头为止
virusswb 2008-06-16
  • 打赏
  • 举报
回复
如 一千一百九十 转换成为 1190

使用string.split(new char[]{'千',‘百’,十,};
wstar 2008-06-16
  • 打赏
  • 举报
回复
我找了半天 只有下面这个 但是只能转换九十九以内的 哪位大侠来个全的 我觉得这种需求网上应该有呀 自己干写可太累了 实在没有我也只好自己写了...........


public int ChineseNumberToArabicNumber(string ChineseNumber)
{
if (!System.Text.RegularExpressions.Regex.IsMatch(ChineseNumber, @"(^[一二三四五六七八九十]$)|(^十[一二三四五六七八九]$)|(^[二三四五六七八九]十[一二三四五六七八九]{0,1}$)"))
return 0;
int ArabicNumber = 0;
string ReturnStr = "";
string ChineseNumberName = "一二三四五六七八九十";
int[] IntArrayArabicNumberNames = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int length = ChineseNumber.Length;
switch (length)
{
case 1:
ArabicNumber = IntArrayArabicNumberNames[ChineseNumberName.IndexOf(ChineseNumber)];
// return ArabicNumber;
break;
case 2:
if (ChineseNumber[0] != '十')
{
ReturnStr = IntArrayArabicNumberNames[ChineseNumberName.IndexOf(ChineseNumber[0])].ToString().Trim();
ReturnStr += "0";
ArabicNumber = Int16.Parse(ReturnStr);
// return ArabicNumber;
}
else
{
ReturnStr = "1";
ReturnStr += IntArrayArabicNumberNames[ChineseNumberName.IndexOf(ChineseNumber[1])].ToString().Trim();
ArabicNumber = Int16.Parse(ReturnStr);
// return ArabicNumber;
}
break;
case 3:
ReturnStr = IntArrayArabicNumberNames[ChineseNumberName.IndexOf(ChineseNumber[0])].ToString().Trim();
ReturnStr += IntArrayArabicNumberNames[ChineseNumberName.IndexOf(ChineseNumber[2])].ToString().Trim();
ArabicNumber = Int16.Parse(ReturnStr);
// return ArabicNumber;
break;
default:
break;
}
return ArabicNumber;
}
怫悰 2008-06-16
  • 打赏
  • 举报
回复
装个
Visual Studio International Pack 1.0

Visual Studio International Pack 包含一组类库,该类库扩展了.NET Framework对全球化软件开发的支持。使用该类库提供的类,.NET 开发人员可以更方便的创建支持多文化多语言的软件应用。该软件包1.0版提供下面七个组件以增强.NET Framework对全球化软件应用开发的支持。

* East Asia Numeric Formatting Library - 支持将小写的数字字符串格式化成简体中文,繁体中文,日文和韩文的大写数字字符串。
* Japanese Kana Conversion Library - 支持将日文假名(Kana)转化为另一种日文字符。
* Japanese Text Alignment Library - 支持日文特有的一种对齐格式。
* Japanese Yomi Auto-Completion Library - 类库支持感知日文输入法的输入自动完成和一个文本框控制的示例。
* Korean Auto Complete TextBox Control - 在文本框中支持韩文输入法的智能感知和输入自动完成。
* Simplified Chinese Pin-Yin Conversion Library - 支持获取简体中文字符的常用属性比如拼音,多音字,同音字,笔画数。
* Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool - 支持简繁体中文之间的转换. 该组件还包含一个Visual Studio集成开发环境中的插件(Add-in)支持简繁体中文资源文件之间的转换。
曲滨_銘龘鶽 2008-06-16
  • 打赏
  • 举报
回复
这个需求好怪异啊,多半都是要阿转中的

壹佰 一百
中文的可能书写方式太多了,手头没有,关注一下
那位有给发个代码吧,俺学习一下;
jiang270606112 2008-06-16
  • 打赏
  • 举报
回复
public string CmycurD(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;
}
wzy_love_sly 2008-06-16
  • 打赏
  • 举报
回复
这个因该没有通用的,转大写的规则不一样
changjiangzhibin 2008-06-16
  • 打赏
  • 举报
回复
CSDN有一遍这样的贴子,找一找吧

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧