Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ff3eca0

Browse files
author
Stefan Krah
committed
Allow printing a leading '-' and the maximum number of exponent digits
rather than raising RuntimeError (allocated space is sufficient for the additional character).
1 parent 0774e9b commit ff3eca0

2 files changed

Lines changed: 50 additions & 2 deletions

File tree

Lib/test/test_decimal.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4977,6 +4977,54 @@ def test_exact_conversion(self):
49774977
x = "1e%d" % (-sys.maxsize-1)
49784978
self.assertRaises(InvalidOperation, Decimal, x)
49794979

4980+
def test_from_tuple(self):
4981+
Decimal = C.Decimal
4982+
localcontext = C.localcontext
4983+
InvalidOperation = C.InvalidOperation
4984+
Overflow = C.Overflow
4985+
Underflow = C.Underflow
4986+
4987+
with localcontext() as c:
4988+
4989+
c.traps[InvalidOperation] = True
4990+
c.traps[Overflow] = True
4991+
c.traps[Underflow] = True
4992+
4993+
# SSIZE_MAX
4994+
x = (1, (), sys.maxsize)
4995+
self.assertEqual(str(c.create_decimal(x)), '-0E+999999')
4996+
self.assertRaises(InvalidOperation, Decimal, x)
4997+
4998+
x = (1, (0, 1, 2), sys.maxsize)
4999+
self.assertRaises(Overflow, c.create_decimal, x)
5000+
self.assertRaises(InvalidOperation, Decimal, x)
5001+
5002+
# SSIZE_MIN
5003+
x = (1, (), -sys.maxsize-1)
5004+
self.assertEqual(str(c.create_decimal(x)), '-0E-1000026')
5005+
self.assertRaises(InvalidOperation, Decimal, x)
5006+
5007+
x = (1, (0, 1, 2), -sys.maxsize-1)
5008+
self.assertRaises(Underflow, c.create_decimal, x)
5009+
self.assertRaises(InvalidOperation, Decimal, x)
5010+
5011+
# OverflowError
5012+
x = (1, (), sys.maxsize+1)
5013+
self.assertRaises(OverflowError, c.create_decimal, x)
5014+
self.assertRaises(OverflowError, Decimal, x)
5015+
5016+
x = (1, (), -sys.maxsize-2)
5017+
self.assertRaises(OverflowError, c.create_decimal, x)
5018+
self.assertRaises(OverflowError, Decimal, x)
5019+
5020+
# Specials
5021+
x = (1, (), "N")
5022+
self.assertEqual(str(Decimal(x)), '-sNaN')
5023+
x = (1, (0,), "N")
5024+
self.assertEqual(str(Decimal(x)), '-sNaN')
5025+
x = (1, (0, 1), "N")
5026+
self.assertEqual(str(Decimal(x)), '-sNaN1')
5027+
49805028

49815029
all_tests = [
49825030
CExplicitConstructionTest, PyExplicitConstructionTest,

Modules/_decimal/_decimal.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2435,8 +2435,8 @@ dectuple_as_str(PyObject *dectuple)
24352435
if (sign_special[1] == '\0') {
24362436
/* not a special number */
24372437
*cp++ = 'E';
2438-
n = snprintf(cp, MPD_EXPDIGITS+1, "%" PRI_mpd_ssize_t, exp);
2439-
if (n < 0 || n >= MPD_EXPDIGITS+1) {
2438+
n = snprintf(cp, MPD_EXPDIGITS+2, "%" PRI_mpd_ssize_t, exp);
2439+
if (n < 0 || n >= MPD_EXPDIGITS+2) {
24402440
PyErr_SetString(PyExc_RuntimeError,
24412441
"internal error in dec_sequence_as_str");
24422442
goto error;

0 commit comments

Comments
 (0)