using System;
namespace JiajieERP
{
/// <summary>
/// clsNumtoCapital 的摘要说明。
/// </summary>
public class clsNumtoCapital
{
private static string [] HanDigiStr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private static string [] HanDiviStr = { "","拾","佰","仟","万","拾","佰","仟","亿",
"拾","佰","仟","万","拾","佰","仟","亿",
"拾","佰","仟","万","拾","佰","仟" };
public clsNumtoCapital()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private static string PositiveIntegerToHanStr(string NumStr)
{ // 输入字符串必须正整数,只允许前导空格(必须右对齐),不宜有前导零
string RMBStr="";
int len,n;
bool hasvalue=false,lastzero=false; // 亿、万进位前有数值标记
len = NumStr.Length;
for(int i=0;i<len;i++)
{
// if( NumStr[i]==' ' ) continue; // AnsiString[] base is 1
n = NumStr[i] - '0';
// if( n<0 || n>9 ) return "输入含非数字字符!";
int j=len-i-1;
if( n!=0 )
{
if( lastzero ) RMBStr += HanDigiStr[0]; //若干零后若跟非零值,只显示一个零
// 除了亿万前的零不带到后面
// if( !( n==1 && (i%4)==1 && (lastzero || i==len-1) ) ) // 如十进位前有零也不发壹音用此行
// if( !( n==1 && (i%4)==1 && i==len-1 ) ) // 十进位处于第一位不发壹音
RMBStr += HanDigiStr[n];
RMBStr += HanDiviStr[len-i-1]; // 非零值后加进位,个位为空
hasvalue = true; // 置万进位前有值标记
}
else
{
if( j==8 || j==4 && hasvalue ) // 亿万之间必须有非零值方显示万
RMBStr += HanDiviStr[len-i-1]; // “亿”或“万”
}
if( j%8==0 ) hasvalue = false; // 万进位前有值标记逢亿复位
lastzero = (n==0) && (j%4!=0); // 亿万前有零后不加零,如:拾万贰仟
}
if( RMBStr.Length==0 ) return HanDigiStr[0]; // 输入空字符或"0",返回"零"
return RMBStr;
}
public static string NumToRMBStr(double val)
{
if(val>100000000000)
return "数字过大!"; //不小于千亿(可以更大点但没有什么意义了)
string SignStr="",TailStr="";
double fraction=0;
Int64 integer=0;
if( val<0 )
{
val = -val;
SignStr = "负";
}
integer=Convert.ToInt64(val-val%1); //整数部分 由于ToInt64本身有四舍五入功能所以要加 val%1 部分
int jiao,fen;
fraction = Math.Round(val%1,2); // 四舍五入到分 在.Net中四舍五入有点争议,它是伍不进位的。
fen = Convert.ToInt32((fraction*100)%10);//分
jiao = Convert.ToInt32((fraction*100-fen)/10);//角
if( jiao==0 && fen==0 )
{
TailStr = "整";
}
else
{
TailStr = HanDigiStr[jiao];
if( jiao!=0 )
TailStr += "角";
if( integer==0 && jiao==0 ) // 零元后不写零几分
TailStr = "";
if( fen!=0 )
TailStr += HanDigiStr[fen] + "分";
}
// 下一行可用于非正规金融场合,0.03只显示“叁分”而不是“零元叁分”
// if( integer==0 ) return SignStr+TailStr;
return SignStr+PositiveIntegerToHanStr( integer.ToString() )+"元"+TailStr;
}
}
}
namespace JiajieERP
{
/// <summary>
/// clsNumtoCapital 的摘要说明。
/// </summary>
public class clsNumtoCapital
{
private static string [] HanDigiStr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private static string [] HanDiviStr = { "","拾","佰","仟","万","拾","佰","仟","亿",
"拾","佰","仟","万","拾","佰","仟","亿",
"拾","佰","仟","万","拾","佰","仟" };
public clsNumtoCapital()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private static string PositiveIntegerToHanStr(string NumStr)
{ // 输入字符串必须正整数,只允许前导空格(必须右对齐),不宜有前导零
string RMBStr="";
int len,n;
bool hasvalue=false,lastzero=false; // 亿、万进位前有数值标记
len = NumStr.Length;
for(int i=0;i<len;i++)
{
// if( NumStr[i]==' ' ) continue; // AnsiString[] base is 1
n = NumStr[i] - '0';
// if( n<0 || n>9 ) return "输入含非数字字符!";
int j=len-i-1;
if( n!=0 )
{
if( lastzero ) RMBStr += HanDigiStr[0]; //若干零后若跟非零值,只显示一个零
// 除了亿万前的零不带到后面
// if( !( n==1 && (i%4)==1 && (lastzero || i==len-1) ) ) // 如十进位前有零也不发壹音用此行
// if( !( n==1 && (i%4)==1 && i==len-1 ) ) // 十进位处于第一位不发壹音
RMBStr += HanDigiStr[n];
RMBStr += HanDiviStr[len-i-1]; // 非零值后加进位,个位为空
hasvalue = true; // 置万进位前有值标记
}
else
{
if( j==8 || j==4 && hasvalue ) // 亿万之间必须有非零值方显示万
RMBStr += HanDiviStr[len-i-1]; // “亿”或“万”
}
if( j%8==0 ) hasvalue = false; // 万进位前有值标记逢亿复位
lastzero = (n==0) && (j%4!=0); // 亿万前有零后不加零,如:拾万贰仟
}
if( RMBStr.Length==0 ) return HanDigiStr[0]; // 输入空字符或"0",返回"零"
return RMBStr;
}
public static string NumToRMBStr(double val)
{
if(val>100000000000)
return "数字过大!"; //不小于千亿(可以更大点但没有什么意义了)
string SignStr="",TailStr="";
double fraction=0;
Int64 integer=0;
if( val<0 )
{
val = -val;
SignStr = "负";
}
integer=Convert.ToInt64(val-val%1); //整数部分 由于ToInt64本身有四舍五入功能所以要加 val%1 部分
int jiao,fen;
fraction = Math.Round(val%1,2); // 四舍五入到分 在.Net中四舍五入有点争议,它是伍不进位的。
fen = Convert.ToInt32((fraction*100)%10);//分
jiao = Convert.ToInt32((fraction*100-fen)/10);//角
if( jiao==0 && fen==0 )
{
TailStr = "整";
}
else
{
TailStr = HanDigiStr[jiao];
if( jiao!=0 )
TailStr += "角";
if( integer==0 && jiao==0 ) // 零元后不写零几分
TailStr = "";
if( fen!=0 )
TailStr += HanDigiStr[fen] + "分";
}
// 下一行可用于非正规金融场合,0.03只显示“叁分”而不是“零元叁分”
// if( integer==0 ) return SignStr+TailStr;
return SignStr+PositiveIntegerToHanStr( integer.ToString() )+"元"+TailStr;
}
}
}