转换数字 要考虑细节

数字职场

康拓普是开发电力行业应用软件的公司,该公司有一道与数字转换相关的经典招聘考题,用来考查应聘者的全面思考能力和对细节的把握能力。下面我们对这道题进行深入分析,希望大家从中可以获得宝贵的经验。

题目:请将人民币数字转化为文字,如输入1235,输出壹仟贰佰叁拾伍元。

剖析:此题目貌似简单,但要回答好就不容易了,因为大家容易受题目的误导,忽视对小数的处理。小数,也就是角分厘,如果少于1块时,是不能显示“元”的。此外,整数部分要考虑对连续的零进行处理,只显示一个零,比如20005输出为贰万零伍元。解题时,要先判断输入的数据的合法性,然后把数字一分为二,取出小数点的前后部分分别进行处理,按从右到左的顺序一个字符一个字符地处理,最后合并输出文字(见图)。

09-g13-1.jpg

解题步骤

第一步:判断输入数据的合法性

先判断输入数据的合法性,如果第一位为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了。