C语言并没有提供打印美元一美分值的现成功能。然而,这并不是一个难题,编写一个输出货币值的函数是非常容易的。当你编写了一个这样的函数后,你就可以在任何需要它的程序中调用它了。
这样的函数往往既短小又简单,下文中将简单地描述它的工作方式。在本书中,这个函数被分解成几个较小的容易编写的程序段,因而很容易理解。把一个程序分解为较小的程序段的原因在第11章中已经介绍过了。
这个函数需要使用一些标准C函数,因此你需要包含一些相应的头文件。在任何使用这个函数的程序的开头,你都应该确保包含以下这些头文件:
#tinclude <stdio. h>
#include <stdlib. h>
# include <math. h>
# include <string. h>
包含了所需的头文件后,你就可以创建一个接受美元值并按带逗号的形式打印该值的函数:
void PrintDollars( double Dollars )
{
char buf[20];
int l , a;
sprintf( buf, " %olf", Dollars );
l = strchr( buf, '.') - buf;
for(a= (Dollars<0.0); a<1; ++a)
printf( "%c", buf[a]) ;
if(( ( ( l - a ) % 3) == 1 )&&(a !=l - 1 ) )
printf( " ," ) ;
}
你可能习惯于用浮点数来表示实数,这是很平常的。然而,浮点数通常不适合于金融工作,因为它有较大程度的不准确性,例如舍入错误。双精度类型的准确度比浮点数高得多,因此它更适合于真正的数字工作。
只要写一个把整数值传递给该函数的程序,你就可以很方便地测试该函数。然而,该函数还不能打印小数或“零头”,为此,还要专门编写一个完成这项工作的函数:
void PrintCents ( double Cents)
{
char buf[10 ];
sprintf( buf, "%-. 02f" , Cents );
printf("%s\n" , bur + 1 + (Cents <= 0) );
上述函数接受一个小数值并按正确的格式打印该值。同样,只要编写一个把小数值传递给该函数的程序,你就可以测试该函数了。
现在你已经有了两个函数:一个能打印货币值的美元部分(整数部分),另一个能打印货币值的美分部分(小数部分)。你当然不希望先把一个数分解成两部分,然后再分别调用这两个函数!但是,你可以编写一个函数,用它来接受货币值并把该值分解成美元和美分两部分,然后再调用已有的另外两个函数。这个函数如下所示:
void DollarsAndCents ( double Amount )
{
double Dollars = Amount >= 0.0 ? floor( Amount ) : ceil(Amount) ;
double Cents = Amount - (double) Dollars;
if ( Dollars < 0.0 ) printf( "-" );
printf( " $" );
PrintDollars ( Dollars ) ;
PrintCents ( Cents ) ;
}
这就是所要的函数! DollarsAndCents()函数接受一个实数值(double类型),并按美元一美分的格式把该值打印到屏幕上。如果你要测试一下这个函数,你可以编写一个main()函数,让它去打印多个美元一美分值。下面就是这样的一个函数:
int main()
{
double num= . 0123456789;
int a ;
for(a = 0; a<12; ++a )
{
DollarsAndCents( num );
num *= 10.0;
}
return( 0 );
}
它的输出结果为:
如果你想按其它的形式打印货币值,你可以很方便地修改这个程序,使其按其它格式打印数字。