转换数字 要考虑细节
数字职场
康拓普是开发电力行业应用软件的公司,该公司有一道与数字转换相关的经典招聘考题,用来考查应聘者的全面思考能力和对细节的把握能力。下面我们对这道题进行深入分析,希望大家从中可以获得宝贵的经验。
题目:请将人民币数字转化为文字,如输入1235,输出壹仟贰佰叁拾伍元。
剖析:此题目貌似简单,但要回答好就不容易了,因为大家容易受题目的误导,忽视对小数的处理。小数,也就是角分厘,如果少于1块时,是不能显示“元”的。此外,整数部分要考虑对连续的零进行处理,只显示一个零,比如20005输出为贰万零伍元。解题时,要先判断输入的数据的合法性,然后把数字一分为二,取出小数点的前后部分分别进行处理,按从右到左的顺序一个字符一个字符地处理,最后合并输出文字(见图)。

解题步骤
第一步:判断输入数据的合法性
先判断输入数据的合法性,如果第一位为0或者是小数点则输入不合法,如果输入非数字字符也不合法,中止程序。关键代码如下(完整代码下载地址:http://www.shudoo.com/bzsoft):
if ((txt='0') and (txt<>'.')) or (txt='.') then
begin
ShowMessage('第一位不能为0或者是.,退出操作');
exit;
end;
//检查字符的合法性
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not(key in ['0'..'9','.',#9]) then
begin
ShowMessage(PChar('输入数据包含非数字字符,将退出操作'));
第二步:小数点后面部分处理(角分厘)
按从右边到左边的顺序依次取出小数点后面部分的字符,如果有连续的零则只显示一个零。关键代码如下(完整代码下载地址:http://www.shudoo.com/bzsoft):
if m>0 then
begin
for i:=m downto 1 do
begin
strlevel[ipos+i]:='';
case i-1 of
0:
if txt[ipos+i]='0' then
strarray[ipos+i]:=''
else
strlevel[ipos+i]:='角';
if txt[ipos+i]='0' then
strarray[ipos+i]:=''
else
strlevel[ipos+i]:='分';
if ispoint and (txt[ipos-1]='0') and (n=1) then
Result:=result+'' //如果少于1块时,不要显示元
else
Result:='元'+result;
第三步:小数点前面部分处理(元)
按从右到左的顺序依次取出小数点前面部分的字符进行处理,有连续的零只显示一个零。关键代码如下(完整代码下载地址:http://www.shudoo.com/bzsoft):
0,4,8,12: strlevel[i]:='';
1,5,9,13: strlevel[i]:='拾';
2,6,10,14: strlevel[i]:='佰';
3,7,11,15: strlevel[i]:='仟';
end; //case
if (txt[i]='0') then strlevel[i]:='';
//要处理零 以及加上万、亿
if n-i=4 then
begin
if strarray[i]='零' then strarray[i]:='';
Result:=strarray[i]+strlevel[i]+'万'+result
我的建议>>
其实本题一点都不难,大学学的编程知识就足够了。不过学生朋友很难在本题上得高分,考虑不全面答案就不全了。
用户输入了两个小数点这种情况考虑过吗?在实际项目运用过程中,比如查询工资,就只能允许用户输入一个小数点,此时还需要判断输入多个小数点是非法的。
判断输入框中输入数据的合法性在工作中被广泛应用到,比如产品编号、证件查询、图书检索等多种输入框都需要判断输入数据的合法性。 不要问为什么题目没有提示,在实际开发中,这些细节都是要自己考虑的。如果仅仅做到能运算,很可能出现输入20005结果输出贰万零零零伍元,考官一看就PASS了。