您的位置:首页 > 其它

简洁精美源于分析透彻,构思明确、求精,逻辑练达。(7)

2017-01-07 19:39 316 查看
/*怎么将一千零一元 转为 1001元?主要思路是与标准模板核对补缺,如:比较零元时保留一,比较零拾时没有添加零,比较零佰时没有添加零,比较零仟时保留一,
这样就变成:一零零一,然后转为数值1001.*/
string 中文金额 = "仟佰拾极仟佰拾载仟佰拾正仟佰拾涧仟佰拾沟仟佰拾穰仟佰拾秭仟佰拾垓仟佰拾京仟佰拾兆仟佰拾亿仟佰拾万仟佰拾元";
string 转换金额 = "伍亿零伍万壹仟零壹元", 补全 = "", 数字 = "", 中文值 = "零壹贰叁肆伍陆柒捌玖";
int 模 = 中文金额.Length, 读 = 转换金额.Length, 转 = 0;
do
{
--模; --读;/*取最后一个字符*/
if (转换金额[读] == '零')/*对缩写“零”的处理,如果取到“零”这个字符*/
{
++模;/*因为跳过“零”这个字符,因此,要把读字符的位置还原*/
continue;/*遇“零”字符继续循环,不往下执行下面的语句*/
}
if(中文金额[模] == 转换金额[读])/*取字符进行对比*/
补全 += 转换金额[--读];/*如果字符相等则取其前一位字符加入*/
else
{
补全 += "零";/*如果对比字符不等则补零*/
++读;/*遇字符不等则返回原比较字符位置,直到比较相等时,由上面逻辑执行取位变动*/
}
数字 = 中文值.IndexOf(补全[转++].ToString())+ 数字;/*直接在补全循环内执行转换为数字,由于补全字符串是尾叠加的,因此,最后合成的是反字符串,用从0序开始转换,就不另写转换为数字的循环了。*/
} while (读 > 0);
Console.WriteLine(补全);
Console.WriteLine("数字{0}", int.Parse(数字));
按思路写好后稍优化:
int 模 = 中文金额.Length, 读 = 转换金额.Length;
do
{
--模; --读;
if (转换金额[读] == '零')
{
++模;
continue;
}
if(中文金额[模] == 转换金额[读])
数字 = 中文值.IndexOf(转换金额[--读].ToString()) + 数字;
else
{
数字 = "0" + 数字;
++读;
}
} while (读 > 0);
Console.WriteLine("数字{0}", Double.Parse(数字));
直接转化为数值演变的代码:
int 模 = 中文金额.Length, 读 = 转换金额.Length, 数值 = 0, 权 = 10;
do
{
--模; --读;
if (转换金额[读] == '零')
{
++模;
continue;
}
if (中文金额[模] == 转换金额[读])
数值 = 权 / 10 * 中文值.IndexOf(转换金额[--读].ToString()) + 数值;
else
++读;
权 *= 10;
} while (读 > 0);
Console.WriteLine("数值{0}", 数值);
修正漏洞代码:/*金额单位之前无数字也无零的情况处理,如:"伍亿伍仟伍佰伍拾万壹仟零壹元"字符串*/
string 转换金额 = "伍亿伍仟伍佰伍拾万壹仟零壹元", 中文值 = "零壹贰叁肆伍陆柒捌玖";
int 模 = 中文金额.Length, 读 = 转换金额.Length, 数值 = 0, 权 = 10;
do
{
--模; --读;
if (转换金额[读] == '零')
{
++模;
continue;
}
if (中文金额[模] == 转换金额[读])
{
int 转值 = 中文值.IndexOf(转换金额[--读].ToString());
if (转值 < 0) ++读;
else 数值 = 权 / 10 * 转值 + 数值;
}
else
++读;
权 *= 10;
} while (读 > 0);
Console.WriteLine("数值{0}", 数值);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: