diff --git a/js/base/functions/number.js b/js/base/functions/number.js index 4a8765586ca8..f1b37c3f0991 100644 --- a/js/base/functions/number.js +++ b/js/base/functions/number.js @@ -87,8 +87,18 @@ const truncate_regExpCache = [] } , truncate = (num, precision = 0) => parseFloat (truncate_to_string (num, precision)) -function precisionFromString (string) { - const split = string.replace (/0+$/g, '').split ('.') +function precisionFromString (str) { + // support string formats like '1e-4' + if (str.indexOf ('e') > -1) { + const numStr = str.replace (/\de/, '') + return parseInt (numStr) * -1 + } + // support integer formats (without dot) like '1', '10' etc [Note: bug in decimalToPrecision, so this should not be used atm] + // if (str.indexOf ('.') === -1) { + // return str.length * -1 + // } + // default strings like '0.0001' + const split = str.replace (/0+$/g, '').split ('.') return (split.length > 1) ? (split[1].length) : 0 } diff --git a/js/digifinex.js b/js/digifinex.js index 6045c66d5e7c..e243c71b5f72 100644 --- a/js/digifinex.js +++ b/js/digifinex.js @@ -408,17 +408,14 @@ module.exports = class digifinex extends Exchange { const withdraw = withdrawStatus > 0; const active = deposit && withdraw; const feeString = this.safeString (currency, 'min_withdraw_fee'); // withdraw_fee_rate was zero for all currencies, so this was the worst case scenario - const fee = this.parseNumber (feeString); const minWithdrawString = this.safeString (currency, 'min_withdraw_amount'); - const minWithdraw = this.parseNumber (minWithdrawString); const minDepositString = this.safeString (currency, 'min_deposit_amount'); - const minDepositPrecisionLength = this.precisionFromString (minDepositString); - // define precision with temporary way - const feePrecisionLength = this.precisionFromString (feeString); - const minWithdrawPrecisionLength = this.precisionFromString (minWithdrawString); const minDeposit = this.parseNumber (minDepositString); - const maxFoundPrecision = Math.max (feePrecisionLength, Math.max (minWithdrawPrecisionLength, minDepositPrecisionLength)); - const precision = this.parseNumber (this.parsePrecision (this.numberToString (maxFoundPrecision))); + const minWithdraw = this.parseNumber (minWithdrawString); + const fee = this.parseNumber (feeString); + // define precision with temporary way + const minFoundPrecision = Precise.stringMin (feeString, Precise.stringMin (minDepositString, minWithdrawString)); + const precision = this.parseNumber (minFoundPrecision); const networkId = this.safeString (currency, 'chain'); const networkCode = this.networkIdToCode (networkId); const network = { @@ -426,7 +423,7 @@ module.exports = class digifinex extends Exchange { 'id': networkId, 'network': networkCode, 'active': active, - 'fee': this.parseNumber (feeString), + 'fee': fee, 'precision': precision, 'deposit': deposit, 'withdraw': withdraw, @@ -472,7 +469,7 @@ module.exports = class digifinex extends Exchange { 'active': active, 'deposit': deposit, 'withdraw': withdraw, - 'fee': fee, + 'fee': this.parseNumber (feeString), 'precision': undefined, 'limits': { 'amount': { diff --git a/php/Exchange.php b/php/Exchange.php index 5d8d5db7c8de..5fba9349e0a9 100644 --- a/php/Exchange.php +++ b/php/Exchange.php @@ -1943,8 +1943,18 @@ public function fetch_currencies($params = array()) { return $this->currencies ? $this->currencies : array(); } - public function precision_from_string($string) { - $parts = explode('.', preg_replace('/0+$/', '', $string)); + public function precision_from_string($str) { + // support string formats like '1e-4' + if (strpos($str, 'e') > -1) { + $numStr = preg_replace ('/\de/', '', $str); + return ((int)$numStr) * -1; + } + // support integer formats (without dot) like '1', '10' etc [Note: bug in decimalToPrecision, so this should not be used atm] + // if (strpos($str, '.') === -1) { + // return strlen(str) * -1; + // } + // default strings like '0.0001' + $parts = explode('.', preg_replace('/0+$/', '', $str)); return (count($parts) > 1) ? strlen($parts[1]) : 0; } diff --git a/python/ccxt/base/exchange.py b/python/ccxt/base/exchange.py index d34677366acf..1e3a1461e3e3 100644 --- a/python/ccxt/base/exchange.py +++ b/python/ccxt/base/exchange.py @@ -1433,8 +1433,16 @@ def check_address(self, address): raise InvalidAddress(self.id + ' address is invalid or has less than ' + str(self.minFundingAddressLength) + ' characters: "' + str(address) + '"') return address - def precision_from_string(self, string): - parts = re.sub(r'0+$', '', string).split('.') + def precision_from_string(self, str): + # support string formats like '1e-4' + if 'e' in str: + numStr = re.sub(r'\de', '', str) + return int(numStr) * -1 + # support integer formats (without dot) like '1', '10' etc [Note: bug in decimalToPrecision, so this should not be used atm] + # if not ('.' in str): + # return len(str) * -1 + # default strings like '0.0001' + parts = re.sub(r'0+$', '', str).split('.') return len(parts[1]) if len(parts) > 1 else 0 def load_markets(self, reload=False, params={}):