Header file for mnyfmt()
.
More...
Go to the source code of this file.
|
char * | mnyfmt (char *fmtstr, char dec, mnyfmt_long moneyval, unsigned CE) |
| Formats and stores in fmtstr the money amount. More...
|
|
mnyfmt_long | str2mnyCE (const char *amount, char dec, unsigned CE) |
| Returns an integer value that corresponds to 'amount', scaled 10^CE digits. More...
|
|
char * | mnyfmt0 (char *fmtstr, mnyfmt_long moneyval) |
| return mnyfmt(fmtstr, '\0', moneyval, 0 ) More...
|
|
Header file for mnyfmt()
.
This C function formats money amounts using a picture clause.
- See also
- http://google.com/search?as_qdr=all&num=100&as_q=picture+clause
- Author
- Adolfo Di Mare adolf.nosp@m.o@di.nosp@m.-mare.nosp@m..com
- Date
- 2013
Definition in file mnyfmt.h.
(2^128 < 10^40) && (2*40 < 96) ==> char[96] is big enough for 128 bits
Definition at line 23 of file mnyfmt.h.
#define mnyfmt_format_char (char)('9') |
char* mnyfmt |
( |
char * |
fmtstr, |
|
|
char |
dec, |
|
|
mnyfmt_long |
moneyval, |
|
|
unsigned |
CE |
|
) |
| |
Formats and stores in fmtstr
the money amount.
Before invocation, the formatting pattern (picture clause) is stored in result string fmtstr
. To avoid using
(double) values that have many round off problems, the parameter for this function is an integer scaled to 10^CE digits. For example, when using CE==2 digits, the monetary value "$2,455.87" is representad by the integer '245587', and if CE==4 digits are used, the integer value would be '24558700'.
- The (integer) value to format is
moneyval
.
- Overwrites
fmtstr
with the formatted value.
- On error, leaves
fmtstr
untouched and returns
(char*)(0).
- If the
fmtstr
does not have enough format characters '9'
for the integer part to format, of if the '-'
cannot fit on top of a '9'
character, fmtstr
remains untouched and the value returned is
(char*)(0).
- The valid range for CE, the 'currenct exponent', is [0..6] [ a CE of 7 or bigger leaves
fmtstr
untouched and the value returned is
(char*)(0) ].
- The first occurrence of the character
dec
is the decimal fraction separator (usually
'.' or
',').
- When the decimal fraction separator character
dec
does not appear in fmtstr
it is assumed to be '\0'
(end of string character).
- After the
dec
separator all the leading consecutive '9'
format characters are substituted with the corresponding digit from the decimal part in moneyval
, using digit zero '0'
as fill character.
- All digits that inmediatly follow the decimal fraction separator are changed either to zero or to the corresponding digit taken from the decimal part in
moneyval
.
- Both the integer part and the fractional part are filled with the digits that correspond to its position. This means that a format string like
"9999.9999"
wild yield "0123.8700"
as result when moneyval==1238700
and CE==4
.
- Characters trailing after the
dec
separator that are not the '9'
format digit are left untouched.
- All format characters
'9'
appearing before the decimal separator dec
will be replaced by digit zero '0'
if the corresponding digit in moneyval
is not significant.
- When
moneyval
is negative, the '-'
sign will be place over the '9'
immediately before the more significant digit.
- Non format characters in
fmtstr
are left untouched.
- The negative sign always is
'-'
and it is always placed on top of the corresponding format character.
- Returns
(char*)(0) when the formatted value does not fit within strlen(fmtstr)
characters.
- Returns a pointer to the first significant digit in the formatted string, within
fmtstr
or to the '-'
sign if the formatted value is negative.
- Before storing the format string in
fmtstr
, the programmer must ensure that fmtstr
is big enough to hold the format string.
1 // (2^128 < 10^40) && (2*40<96) ==> char[96] holds a
2 char *sgn, fmtstr[96],mem[96]; // 128 bit integer
4 unsigned CE, ten_pow_CE;
5 CE = 2; ten_pow_CE = 100; // 10^CE -> "Currency Exponent"
7 strcpy( mem, "USD$ " ); // Picture clause
8 strcpy( fmtstr , "99,999,999.99999" );
9 if (( sgn = mnyfmt( fmtstr , '.' ,-10245587,CE ) )) {
10 assertTrue( eqstr( fmtstr , "0-,102,455.87000") );
11 if ( (*sgn=='-') && (','==*(sgn+1)) ) { ++sgn; *sgn='-'; }
12 assertTrue( eqstr( sgn, "-102,455.87000") );
15 assertTrue( eqstr( mem, "USD$ -102,455.87000") );
18 assertFalse( "ERROR [???]: " "-102,455.87000" );
- See also
- mnyfmtts.c
Definition at line 102 of file mnyfmt.c.
mnyfmt_long str2mnyCE |
( |
const char * |
amount, |
|
|
char |
dec, |
|
|
unsigned |
CE |
|
) |
| |
Returns an integer value that corresponds to 'amount', scaled 10^CE digits.
- For " -102,455.87" returns '-102_455_8700' when CE==4 && dec=='.'.
- For " -102,455.07" returns '-102_455_07' when CE==2 && dec=='.'.
- For " -102,455.87" returns '-102_455' when CE==0 && dec=='.'.
- The decimal separator is 'dec'.
- CE is the 'currency exponent'.
- Requires 'CE<=6' <–> scale up to 10^6 <–> 6 decimal digits.
1 {{ // test::str2mnyCE()
1 assertTrue( -1024550700 == str2mnyCE(" -102,455.07", '.', 4) );
2 assertTrue( -102455070 == str2mnyCE(" -102,455.07", '.', 3) );
3 assertTrue( -10245507 == str2mnyCE(" -102,455.07", '.', 2) );
4 assertTrue( -1024550 == str2mnyCE(" -102,455.07", '.', 1) );
5 assertTrue( -102455 == str2mnyCE(" -102,455.07", '.', 0) );
7 assertTrue( 1024558700 == str2mnyCE(" 102,455.87", '.', 4) );
8 assertTrue( 102455870 == str2mnyCE(" 102,455.87", '.', 3) );
9 assertTrue( 10245587 == str2mnyCE(" 102,455.87", '.', 2) );
10 assertTrue( 1024558 == str2mnyCE(" 102,455.87", '.', 1) );
11 assertTrue( 102455 == str2mnyCE(" 102,455.87", '.', 0) );
- See also
- str2mnyCE.c
Definition at line 40 of file str2mnyCE.c.
return mnyfmt(fmtstr, '\0', moneyval, 0 )
Definition at line 79 of file mnyfmt.h.