summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/databases/mssql.py
diff options
context:
space:
mode:
authorMichael Trier <mtrier@gmail.com>2009-01-22 01:55:06 +0000
committerMichael Trier <mtrier@gmail.com>2009-01-22 01:55:06 +0000
commita7459fe1abaec1c4d6aca443e7b7e5f1d1e6db21 (patch)
tree897cb9669f76cd360d104d26cc678f4f90cf1f05 /lib/sqlalchemy/databases/mssql.py
parent52e2c2d916fb45d8169d6b273db2b39b0fc8ccee (diff)
downloadsqlalchemy-a7459fe1abaec1c4d6aca443e7b7e5f1d1e6db21.tar.gz
Trying one more time to get the decimal handling on mssql right. Closes #1282.
Diffstat (limited to 'lib/sqlalchemy/databases/mssql.py')
-rw-r--r--lib/sqlalchemy/databases/mssql.py38
1 files changed, 28 insertions, 10 deletions
diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py
index 1a3c20a07..ddd130679 100644
--- a/lib/sqlalchemy/databases/mssql.py
+++ b/lib/sqlalchemy/databases/mssql.py
@@ -328,17 +328,35 @@ class MSNumeric(sqltypes.Numeric):
if value is None:
# Not sure that this exception is needed
return value
- else:
- if isinstance(value, decimal.Decimal):
- sign = (value < 0 and '-' or '')
- if value._exp > -1:
- return float(sign + value._int + '0' * value._exp)
- else:
- s = value._int.zfill(-value._exp+1)
- pos = len(s) + value._exp
- return sign + s[:pos] + '.' + s[pos:]
+
+ elif isinstance(value, decimal.Decimal):
+ if value.adjusted() < 0:
+ result = "%s0.%s%s" % (
+ (value < 0 and '-' or ''),
+ '0' * (abs(value.adjusted()) - 1),
+ "".join([str(nint) for nint in value._int]))
+
else:
- return value
+ if 'E' in str(value):
+ result = "%s%s%s" % (
+ (value < 0 and '-' or ''),
+ "".join([str(s) for s in value._int]),
+ "0" * (value.adjusted() - (len(value._int)-1)))
+ else:
+ if (len(value._int) - 1) > value.adjusted():
+ result = "%s%s.%s" % (
+ (value < 0 and '-' or ''),
+ "".join([str(s) for s in value._int][0:value.adjusted() + 1]),
+ "".join([str(s) for s in value._int][value.adjusted() + 1:]))
+ else:
+ result = "%s%s" % (
+ (value < 0 and '-' or ''),
+ "".join([str(s) for s in value._int][0:value.adjusted() + 1]))
+
+ return result
+
+ else:
+ return value
return process