@@ -291,12 +291,36 @@ static void decimal_result(sqlite3_context *pCtx, Decimal *p){
291291 sqlite3_result_text (pCtx , z , i , sqlite3_free );
292292}
293293
294+ /*
295+ ** Round a decimal value to N significant digits. N must be positive.
296+ */
297+ static void decimal_round (Decimal * p , int N ){
298+ int i ;
299+ int nZero ;
300+ if ( N < 1 ) return ;
301+ for (nZero = 0 ; nZero < p -> nDigit && p -> a [nZero ]== 0 ; nZero ++ ){}
302+ N += nZero ;
303+ if ( p -> nDigit <=N ) return ;
304+ if ( p -> a [N ]> 4 ){
305+ p -> a [N - 1 ]++ ;
306+ for (i = N - 1 ; i > 0 && p -> a [i ]> 9 ; i -- ){
307+ p -> a [i ] = 0 ;
308+ p -> a [i - 1 ]++ ;
309+ }
310+ if ( p -> a [0 ]> 9 ){
311+ p -> a [0 ] = 1 ;
312+ p -> nFrac -- ;
313+ }
314+ }
315+ memset (& p -> a [N ], 0 , p -> nDigit - N );
316+ }
317+
294318/*
295319** Make the given Decimal the result in an format similar to '%+#e'.
296320** In other words, show exponential notation with leading and trailing
297321** zeros omitted.
298322*/
299- static void decimal_result_sci (sqlite3_context * pCtx , Decimal * p ){
323+ static void decimal_result_sci (sqlite3_context * pCtx , Decimal * p , int N ){
300324 char * z ; /* The output buffer */
301325 int i ; /* Loop counter */
302326 int nZero ; /* Number of leading zeros */
@@ -314,7 +338,8 @@ static void decimal_result_sci(sqlite3_context *pCtx, Decimal *p){
314338 sqlite3_result_null (pCtx );
315339 return ;
316340 }
317- for (nDigit = p -> nDigit ; nDigit > 0 && p -> a [nDigit - 1 ]== 0 ; nDigit -- ){}
341+ if ( N < 1 ) N = 0 ;
342+ for (nDigit = p -> nDigit ; nDigit > N && p -> a [nDigit - 1 ]== 0 ; nDigit -- ){}
318343 for (nZero = 0 ; nZero < nDigit && p -> a [nZero ]== 0 ; nZero ++ ){}
319344 nFrac = p -> nFrac + (nDigit - p -> nDigit );
320345 nDigit -= nZero ;
@@ -677,10 +702,16 @@ static void decimalFunc(
677702 sqlite3_value * * argv
678703){
679704 Decimal * p = decimal_new (context , argv [0 ], 0 );
680- UNUSED_PARAMETER (argc );
705+ int N ;
706+ if ( argc == 2 ){
707+ N = sqlite3_value_int (argv [1 ]);
708+ if ( N > 0 ) decimal_round (p , N );
709+ }else {
710+ N = 0 ;
711+ }
681712 if ( p ){
682713 if ( sqlite3_user_data (context )!= 0 ){
683- decimal_result_sci (context , p );
714+ decimal_result_sci (context , p , N );
684715 }else {
685716 decimal_result (context , p );
686717 }
@@ -850,7 +881,7 @@ static void decimalPow2Func(
850881 UNUSED_PARAMETER (argc );
851882 if ( sqlite3_value_type (argv [0 ])== SQLITE_INTEGER ){
852883 Decimal * pA = decimalPow2 (sqlite3_value_int (argv [0 ]));
853- decimal_result_sci (context , pA );
884+ decimal_result_sci (context , pA , 0 );
854885 decimal_free (pA );
855886 }
856887}
@@ -871,7 +902,9 @@ int sqlite3_decimal_init(
871902 void (* xFunc )(sqlite3_context * ,int ,sqlite3_value * * );
872903 } aFunc [] = {
873904 { "decimal" , 1 , 0 , decimalFunc },
905+ { "decimal" , 2 , 0 , decimalFunc },
874906 { "decimal_exp" , 1 , 1 , decimalFunc },
907+ { "decimal_exp" , 2 , 1 , decimalFunc },
875908 { "decimal_cmp" , 2 , 0 , decimalCmpFunc },
876909 { "decimal_add" , 2 , 0 , decimalAddFunc },
877910 { "decimal_sub" , 2 , 0 , decimalSubFunc },
0 commit comments