Skip to content

Commit c019cae

Browse files
committed
Add BigDecimal#precision_scale
1 parent ceaf16b commit c019cae

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

ext/bigdecimal/bigdecimal.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,24 @@ BigDecimal_scale(VALUE self)
481481
return SSIZET2NUM(scale);
482482
}
483483

484+
/*
485+
* call-seq:
486+
* precision_scale -> [integer, integer]
487+
*
488+
* Returns a 2-length array; the first item is the result of
489+
* BigDecimal#precision and the second one is of BigDecimal#scale.
490+
*
491+
* See BigDecimal#precision.
492+
* See BigDecimal#scale.
493+
*/
494+
static VALUE
495+
BigDecimal_precision_scale(VALUE self)
496+
{
497+
ssize_t precision, scale;
498+
BigDecimal_count_precision_and_scale(self, &precision, &scale);
499+
return rb_assoc_new(SSIZET2NUM(precision), SSIZET2NUM(scale));
500+
}
501+
484502
/*
485503
* call-seq:
486504
* n_significant_digits -> integer
@@ -4228,6 +4246,7 @@ Init_bigdecimal(void)
42284246
rb_define_method(rb_cBigDecimal, "precs", BigDecimal_prec, 0);
42294247
rb_define_method(rb_cBigDecimal, "precision", BigDecimal_precision, 0);
42304248
rb_define_method(rb_cBigDecimal, "scale", BigDecimal_scale, 0);
4249+
rb_define_method(rb_cBigDecimal, "precision_scale", BigDecimal_precision_scale, 0);
42314250
rb_define_method(rb_cBigDecimal, "n_significant_digits", BigDecimal_n_significant_digits, 0);
42324251

42334252
rb_define_method(rb_cBigDecimal, "add", BigDecimal_add2, 2);

test/bigdecimal/test_bigdecimal.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2123,6 +2123,17 @@ def test_scale_special
21232123
end
21242124
end
21252125

2126+
def test_precision_scale
2127+
assert_equal([2, 0], BigDecimal("11.0").precision_scale)
2128+
assert_equal([2, 1], BigDecimal("1.1").precision_scale)
2129+
assert_equal([2, 2], BigDecimal("0.11").precision_scale)
2130+
2131+
BigDecimal.save_exception_mode do
2132+
BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
2133+
assert_equal([0, 0], BigDecimal("Infinity").precision_scale)
2134+
end
2135+
end
2136+
21262137
def test_n_significant_digits_only_integer
21272138
assert_equal(0, BigDecimal(0).n_significant_digits)
21282139
assert_equal(1, BigDecimal(1).n_significant_digits)

0 commit comments

Comments
 (0)