Private Sub btnZhuanHuan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZhuanHuan.Click Try '************************************************************************************************** Dim strNum As String = txtInPut.Text.Trim '接受输入区字串 Dim leftStr As String = "" '分解左边部分 Dim rightStr As String = "" '分解右边部分 Dim strHanZiLeft As String = "" '转换后左侧字串 Dim strHanZiRight As String = "" '转换后右侧字串 '************************************************************************************************** '先判断是否有小数点 '有进入if If InStr(strNum, ".") > 0 Then Dim i As Integer = InStr(strNum, ".") '如果存在小数点 截取小数部分rightStr leftStr = strNum.Substring(0, i - 1) rightStr = strNum.Substring(i, Len(strNum) - i) '此for循环循环出leftStr的数值 For i = 0 To leftStr.Length - 1 'ShuToHan()方法先转换汉字 strHanZiLeft = strHanZiLeft + (ShuToHan(leftStr.Substring(i, 1))) 'GetDigit()方法在数字后面加单位 If leftStr.Length - i - 2 >= 0 Then strHanZiLeft = strHanZiLeft + GetDigit(leftStr.Length - i - 2) End If Next '此for循环循环出rightStr的数值 For i = 0 To rightStr.Length - 1 strHanZiRight = strHanZiRight + (ShuToHan(rightStr.Substring(i, 1))) Next '显示结果 txtShow.Text = strHanZiLeft & "点" & strHanZiRight '************************************************************************************************** '先判断是否有小数点 '没有进入Else Else ' 没有小数点 rightStr为空 循环的长度为strNum的长度 Dim i As Integer = Len(strNum) leftStr = strNum.Substring(0, i) : rightStr = "" For i = 0 To leftStr.Length - 1 'ShuToHan()方法先转换汉字 strHanZiLeft = strHanZiLeft + (ShuToHan(leftStr.Substring(i, 1))) 'GetDigit()方法在数字后面加单位 If leftStr.Length - i - 2 >= 0 Then strHanZiLeft = strHanZiLeft + GetDigit(leftStr.Length - i - 2) End If Next txtShow.Text = strHanZiLeft End If Catch ex As Exception MsgBox(ex.ToString) End Try End Sub '获取位数 Public Function GetDigit(ByVal e As Integer) As String Dim Digit As String = "拾佰仟万拾佰仟亿拾佰仟" Return Digit.Substring(CInt(e), 1) End Function '数字到汉字 Function ShuToHan(ByVal e As Integer) As String Dim strShuToHan As String = "零壹贰叁肆伍陆柒捌玖拾" Return strShuToHan.Substring(CInt(e), 1) End Function
修改了这部分。 101000.10 壹拾万零壹仟元零壹角正 壹拾万壹仟元壹角正 两种写法都对应该。
我注释掉的是前面的写法,万那里的零没写,只写了个元后加零的。欢迎继续找茬……
//金额大于1元
if (numLength > 2 && yuanTag)
{
if ((numLength - 3) == (i - 1))
{
cnNum = "元" + cnNum;
yuanTag = false;
preNumChar = '元'; //if (!preNumChar.Equals('整') && cnNumCharArray[i - 1].Equals('零'))
//{
// cnNum = "元零" + cnNum;
// yuanTag = false;
// preNumChar = '元';
//}
//else
//{
// cnNum = "元" + cnNum;
// yuanTag = false;
// preNumChar = '元';
//}
}
}
//金额大于万元
if (numLength > 6 && wanTag)
{
if ((numLength - 7) == (i - 1))
{
//如果万位到千万位都为0,则不输出“万”
if (numLength > 10 && numCharArray[1].Equals('0')
&& numCharArray[1].Equals('0')
&& numCharArray[2].Equals('0')
&& numCharArray[3].Equals('0')
&& numCharArray[4].Equals('0'))
{
wanTag = false;
}
else if (cnNumCharArray[i - 1].Equals('零'))
{
cnNum = "万" + cnNum;
wanTag = false;
preNumChar = cnNumCharArray[i - 1];
continue;
}
else
{
cnNum = "万" + cnNum;
}
wanTag = false;
} }
private string ConvertNumberToUpper(string p)
{
string strPriceText = string.Empty;
bool bPrevBitIsZero = false;
double dblPrice = 0;
string strNumChar=string.Empty;
string strNumWord=string.Empty;
string[] strNumChars = new string[] { "", "拾", "百", "千", "万", "拾", "百", "千", "亿", "拾", "百", "千", "万" };
string[] strNumWords=new string[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
if (double.TryParse(p, out dblPrice))
{
p=dblPrice.ToString();
for(int i=p.Length-1;i>=0;i--)
{
strNumWord = ""; int iNum = 0;
if (int.TryParse(p[i].ToString(), out iNum))
{
if (i < p.Length - 1)
{
bPrevBitIsZero = p[i + 1].ToString().Equals("0");
} if (iNum != 0)
{
if (i == 0) //数字最高位为1时,若其与拾组合,通常也不读出来
{
if (!strNumChars[p.Length - i - 1].Equals("拾"))
strNumWord = strNumWords[iNum];
}
else
strNumWord = strNumWords[iNum];
}
else
{
if (!bPrevBitIsZero)
strNumWord = strNumWords[iNum]; if (i == p.Length - 1 && iNum == 0) //数字最低位为0时不读出来
strNumWord = ""; if ((p.Length - i - 1) % 4 == 0 && iNum == 0)
{
strNumWord = "";
}
} if (iNum != 0 || ((p.Length - i - 1) % 4 == 0))
{
strNumWord = strNumWord + strNumChars[p.Length - i - 1];
}
} strPriceText = strNumWord + strPriceText;
}
} return strPriceText;
}
给你写一个,基本没什么问题,小数我没写,我相信你能搞定。
/// 金额转换,将阿拉伯数字转化为中文大写数字
/// </summary>
/// <param name="strNum">小写金额</param>
/// <returns>大写金额</returns>
public static string ToChineseNum(string strNum)
{
try
{
strNum = strNum.Replace(".", "");
Int64 num = Convert.ToInt64(strNum); // 先转换,如果不成功,说明数字有问题抛出错误。为了测试方便,实际应用的话应该写相关的输入约束。 char[] cnText = new char[] { '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
char[] unitText = new char[] { '仟', '佰', '拾' };
char[] systemText = new char[] { '元', '万', '亿' }; strNum = strNum.TrimStart('0');
int level = (int)Math.Ceiling((double)((strNum.Length - 2) / 4.0));
int count = 4 * level + 2;
strNum = strNum.PadLeft(count, '0');
char[] charArray = strNum.ToCharArray();
string result = string.Empty;
for (int i = 0; i * 4 <= charArray.Length - 3; i++)
{
char[] group = new char[] { charArray[i * 4], charArray[i * 4 + 1], charArray[i * 4 + 2], charArray[i * 4 + 3] };
result += GetThreeCharCn(group, cnText, unitText) + systemText[--level].ToString();
}
string strForFloat = string.Empty;
char charJiao = charArray[charArray.Length - 2];
if (charJiao != '0')
{
strForFloat += cnText[int.Parse(charJiao.ToString()) - 1] + "角";
}
char charFen = charArray[charArray.Length - 1];
if (charFen != '0')
{
strForFloat += cnText[int.Parse(charFen.ToString()) - 1] + "分";
}
return result + (strForFloat == string.Empty ? (result == string.Empty ? "零元整":"整") : strForFloat);
}
catch (Exception e)
{
return "error!";
}
} private static string GetThreeCharCn(char[] chars, char[] cnText, char[] unitText)
{
int four = chars[0] - '0';
int three = chars[1] - '0';
int two = chars[2] - '0';
int one = chars[3] - '0'; string str = string.Empty; str += four == 0 ? "" : cnText[four - 1].ToString() + unitText[0].ToString();
str += three == 0 ? (four == 0 ? "" : "零") : cnText[three - 1].ToString() + unitText[1].ToString();
str += two == 0 ? ((four != 0 || three != 0) ? "零" : "") : cnText[two - 1].ToString() + unitText[2].ToString();
str += one == 0 ? "" : cnText[one - 1].ToString(); return str;
}
我也来凑个热闹
多谢阿,明天再继续看看,争取把自己的精炼精炼去。
很久没写代码了,就是为了自己用才写的,应该很丑吧,嘿嘿。
private string ConvertNumberToUpper(string p)
{
string strPriceText = string.Empty;
string strLowerPriceText = string.Empty;
bool bPrevBitIsZero = false;
double dblPrice = 0;
string strNumChar=string.Empty;
string strNumWord=string.Empty;
string[] strNumLower = new string[] { "角", "分" };
string[] strNumChars = new string[] { "圆", "拾", "百", "千", "万", "拾", "百", "千", "亿", "拾", "百", "千", "万" };
string[] strNumWords=new string[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
if (double.TryParse(p, out dblPrice))
{
//因为金额一般只需要记录到角分,所以小数取2位
dblPrice = Math.Round(dblPrice, 2); //先转换非小数位
p = Math.Floor(dblPrice).ToString();
for (int i = p.Length - 1; i >= 0; i--)
{
strNumWord = ""; int iNum = 0;
if (int.TryParse(p[i].ToString(), out iNum))
{
if (i < p.Length - 1)
{
bPrevBitIsZero = p[i + 1].ToString().Equals("0");
} //始终读出此位数字,下面排除不需要读出来的情况
strNumWord = strNumWords[iNum]; if (iNum != 0) //数据位不为0时
{
if (i == 0 && strNumChars[p.Length - i - 1].Equals("拾") && iNum == 1) //此位为最高位且值为1时,若其与拾组合,通常不读出来,若要读出来,注释此逻辑
{
strNumWord = string.Empty;
}
}
else //如果此位为0,则判断前一位是不是0.
{
if (bPrevBitIsZero) //若前一位为0,则此位不需要读出来
{
strNumWord = string.Empty;
} if (i == p.Length - 1 && iNum == 0) //数字最低位为0时不读出来
{
strNumWord = "";
} if ((p.Length - i - 1) % 4 == 0 && iNum == 0) //若是万位或亿位,为0时不读出来
{
strNumWord = "";
}
} if (iNum != 0 || ((p.Length - i - 1) % 4 == 0)) //此位不为0或者此位是万位或亿位,则需要读出位名称
{
strNumWord = strNumWord + strNumChars[p.Length - i - 1];
}
} strPriceText = strNumWord + strPriceText;
} //再转换小数位
p =Math.Round( (dblPrice - Math.Floor(dblPrice)),2).ToString();
int iStartPos = p.IndexOf(".") < 0 ? p.Length : p.IndexOf(".")+1;
for (int i = iStartPos; i < p.Length; i++)
{
strNumWord = ""; int iNum = 0;
if (int.TryParse(p[i].ToString(), out iNum))
{
//始终读出此位数字,下面排除不需要读出来的情况
strNumWord = strNumWords[iNum]; if (iNum != 0) //数据位不为0时
{
}
else //如果此位为0,则判断前一位是不是0.
{
if (bPrevBitIsZero) //若前一位为0,则此位不需要读出来
{
strNumWord = string.Empty;
} if (i == p.Length - 1 && iNum == 0) //数字最低位为0时不读出来
{
strNumWord = "";
}
} if (iNum != 0 ) //此位不为0,则需要读出位名称
{
strNumWord = strNumWord + strNumLower[i-iStartPos];
} strLowerPriceText = strLowerPriceText + strNumWord;
} }
} return strPriceText + strLowerPriceText;
}
/// 金额转换,将阿拉伯数字转化为中文大写数字
/// </summary>
/// <param name="strNum">小写金额</param>
/// <returns>大写金额</returns>
public static string ToChineseNum(string strNum)
{
try
{
strNum = strNum.Replace(".", "").Replace(" ",""); //去掉小数点和空格
if(!System.Text.RegularExpressions.Regex.IsMatch(strNum,"^[0-9.]+$"))
throw new Exception("参数格式不正确!"); char[] cnText = new char[] { '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
char[] unitText = new char[] { '仟', '佰', '拾' };
char[] systemText = new char[] { '元', '万', '亿', '兆', '京', '垓', '杼', '穰' };
int level = (int)Math.Ceiling((double)((strNum.Length - 2) / 4.0));
int count = 4 * level + 2;
strNum = strNum.PadLeft(count, '0');
char[] charArray = strNum.ToCharArray();
string result = string.Empty;
for (int i = 0; i * 4 <= count - 3; i++) //每4个为一组进行匹配
{
result += strNum[i * 4] == '0' ? "" : cnText[strNum[i * 4] - '0' - 1].ToString() + unitText[0].ToString();
result += strNum[i * 4 + 1] == '0' ? (strNum[i * 4] == '0' ? "" : "零") : cnText[strNum[i * 4 + 1] - '0' - 1].ToString() + unitText[1].ToString();
result += strNum[i * 4 + 2] == '0' ? ((strNum[i * 4] != '0' && strNum[i * 4 + 1] != '0') ? "零" : "") : cnText[strNum[i * 4 + 2] - '0' - 1].ToString() + unitText[2].ToString();
result += strNum[i * 4 + 3] == '0' ? "" : cnText[strNum[i * 4 + 3] - '0' - 1].ToString() + systemText[--level].ToString();
}
string strForFloat = string.Empty; //计算小数部分
strForFloat += ( charArray[count - 2] == '0' ? "" : cnText[charArray[count - 2] - '0' - 1] + "角" );
strForFloat += (charArray[count - 1] == '0' ? "" : cnText[charArray[count - 1] - '0' - 1] + "分");
return result + (strForFloat == string.Empty ? (result == string.Empty ? "零元整":"整") : strForFloat);
}
catch (Exception e)
{
return "error!";
}
}
3Q,我手头的票的格就到十亿 - -0 不过,过亿的票据基本很难过去,内控制度……不过很谢谢你。
谢谢,少加了个括号...
public static string ToChineseNum(string strNum)
{
try
{
strNum = strNum.Replace(".", "").Replace(" ",""); //去掉小数点和空格
if(!System.Text.RegularExpressions.Regex.IsMatch(strNum,"^[0-9.]+$"))
throw new Exception("参数格式不正确!"); char[] cnText = new char[] { '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
char[] unitText = new char[] { '仟', '佰', '拾' };
char[] systemText = new char[] { '元', '万', '亿', '兆', '京', '垓', '杼', '穰' };
int level = (int)Math.Ceiling((double)((strNum.Length - 2) / 4.0));
int count = 4 * level + 2;
strNum = strNum.PadLeft(count, '0');
char[] charArray = strNum.ToCharArray();
string result = string.Empty;
for (int i = 0; i * 4 <= count - 3; i++) //每4个为一组进行匹配
{
result += strNum[i * 4] == '0' ? "" : cnText[strNum[i * 4] - '0' - 1].ToString() + unitText[0].ToString();
result += strNum[i * 4 + 1] == '0' ? (strNum[i * 4] == '0' ? "" : "零") : cnText[strNum[i * 4 + 1] - '0' - 1].ToString() + unitText[1].ToString();
result += strNum[i * 4 + 2] == '0' ? ((strNum[i * 4] != '0' && strNum[i * 4 + 1] != '0') ? "零" : "") : cnText[strNum[i * 4 + 2] - '0' - 1].ToString() + unitText[2].ToString();
result += (strNum[i * 4 + 3] == '0' ? "" : cnText[strNum[i * 4 + 3] - '0' - 1].ToString()) + systemText[--level].ToString();
}
string strForFloat = string.Empty; //计算小数部分
strForFloat += ( charArray[count - 2] == '0' ? "" : cnText[charArray[count - 2] - '0' - 1] + "角" );
strForFloat += (charArray[count - 1] == '0' ? "" : cnText[charArray[count - 1] - '0' - 1] + "分");
return result + (strForFloat == string.Empty ? (result == string.Empty ? "零元整":"整") : strForFloat);
}
catch (Exception e)
{
return "error!";
}
}
"壹拾万元壹分"
应该是壹拾万元零壹分ToChineseNum("10000101")
"壹拾万壹元壹分"
应该是壹拾万零壹元壹分ToChineseNum("100101.01")
"壹拾万壹佰壹元壹分"
应该是壹拾万零壹佰零壹元壹分
Private Sub btnZhuanHuan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnZhuanHuan.Click Try
'**************************************************************************************************
Dim strNum As String = txtInPut.Text.Trim '接受输入区字串
Dim leftStr As String = "" '分解左边部分
Dim rightStr As String = "" '分解右边部分 Dim strHanZiLeft As String = "" '转换后左侧字串
Dim strHanZiRight As String = "" '转换后右侧字串
'************************************************************************************************** '先判断是否有小数点
'有进入if
If InStr(strNum, ".") > 0 Then
Dim i As Integer = InStr(strNum, ".")
'如果存在小数点 截取小数部分rightStr
leftStr = strNum.Substring(0, i - 1)
rightStr = strNum.Substring(i, Len(strNum) - i) '此for循环循环出leftStr的数值
For i = 0 To leftStr.Length - 1
'ShuToHan()方法先转换汉字
strHanZiLeft = strHanZiLeft + (ShuToHan(leftStr.Substring(i, 1)))
'GetDigit()方法在数字后面加单位
If leftStr.Length - i - 2 >= 0 Then
strHanZiLeft = strHanZiLeft + GetDigit(leftStr.Length - i - 2)
End If
Next
'此for循环循环出rightStr的数值
For i = 0 To rightStr.Length - 1
strHanZiRight = strHanZiRight + (ShuToHan(rightStr.Substring(i, 1)))
Next
'显示结果
txtShow.Text = strHanZiLeft & "点" & strHanZiRight '**************************************************************************************************
'先判断是否有小数点
'没有进入Else
Else
' 没有小数点 rightStr为空 循环的长度为strNum的长度
Dim i As Integer = Len(strNum)
leftStr = strNum.Substring(0, i) : rightStr = "" For i = 0 To leftStr.Length - 1
'ShuToHan()方法先转换汉字
strHanZiLeft = strHanZiLeft + (ShuToHan(leftStr.Substring(i, 1)))
'GetDigit()方法在数字后面加单位
If leftStr.Length - i - 2 >= 0 Then
strHanZiLeft = strHanZiLeft + GetDigit(leftStr.Length - i - 2)
End If
Next
txtShow.Text = strHanZiLeft
End If
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
'获取位数
Public Function GetDigit(ByVal e As Integer) As String
Dim Digit As String = "拾佰仟万拾佰仟亿拾佰仟"
Return Digit.Substring(CInt(e), 1)
End Function
'数字到汉字
Function ShuToHan(ByVal e As Integer) As String
Dim strShuToHan As String = "零壹贰叁肆伍陆柒捌玖拾"
Return strShuToHan.Substring(CInt(e), 1)
End Function