Merge pull request #254 from Bitcoin-com/wallet/task/427

Fix decimal
This commit is contained in:
Jean-Baptiste Dominguez 2018-08-09 23:30:23 +09:00 committed by GitHub
commit 06a56cab4d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -31,154 +31,149 @@
$scope.displaySizeEqual = !!$scope.sizeEqual; $scope.displaySizeEqual = !!$scope.sizeEqual;
$timeout(function onFormattedAmountTimeout() { var decimalPlaces = {
'0': ['BIF', 'CLP', 'DJF', 'GNF', 'ILS', 'JPY', 'KMF', 'KRW', 'MGA', 'PYG', 'RWF', 'UGX', 'VND', 'VUV', 'XAF', 'XOF', 'XPF'],
var decimalPlaces = { '3': ['BHD', 'IQD', 'JOD', 'KWD', 'OMR', 'TND'],
'0': ['BIF', 'CLP', 'DJF', 'GNF', 'ILS', 'JPY', 'KMF', 'KRW', 'MGA', 'PYG', 'RWF', 'UGX', 'VND', 'VUV', 'XAF', 'XOF', 'XPF'], '8': ['BCH', 'BTC']
'3': ['BHD', 'IQD', 'JOD', 'KWD', 'OMR', 'TND'], };
'8': ['BCH', 'BTC']
}; $scope.$watch('value', function onFormattedAmountWatch() {
formatNumbers(); formatNumbers();
$scope.$watchGroup(['currency', 'value'], function onFormattedAmountWatch() { });
formatNumbers();
});
function buildAmount(start, middle, end) { function buildAmount(start, middle, end) {
$scope.start = start; $scope.start = start;
$scope.middle = middle; $scope.middle = middle;
$scope.end = end; $scope.end = end;
}; };
/** /**
* On Android 4.4, toLocaleString() only returns 3 fractional digits when 8 is specified. * On Android 4.4, toLocaleString() only returns 3 fractional digits when 8 is specified.
*/ */
function ensureEnoughFractionDigits(localizedString, number, desiredFractionDigits) { function ensureEnoughFractionDigits(localizedString, number, desiredFractionDigits) {
if (desiredFractionDigits === 0) { if (desiredFractionDigits === 0) {
// Assume it is OK // Assume it is OK
return localizedString; return localizedString;
} }
var fractionalRe = /^-*(\d*\D)(\d+)$/; var fractionalRe = /^-*(\d*\D)(\d+)$/;
var match = fractionalRe.exec(localizedString); var match = fractionalRe.exec(localizedString);
if (!match || match.length !== 3) { if (!match || match.length !== 3) {
// Don't know what's happening, just return what we have // Don't know what's happening, just return what we have
return localizedString; return localizedString;
}
var decimals = match[2];
var decimalCount = decimals.length;
if (decimalCount >= desiredFractionDigits) {
// Everything is OK.
return localizedString;
}
if (typeof number !== 'number') {
number = parseFloat(number);
}
var fixed = number.toFixed(desiredFractionDigits);
var fixedMatch = fractionalRe.exec(fixed);
if (!fixedMatch || fixedMatch.length !== 3) {
// Don't know what's happening, just return what we have
return localizedString;
}
// Keeps locale decimal separator.
var enough = match[1] + fixedMatch[2];
return enough;
} }
function formatNumbers() { var decimals = match[2];
// During watch, may be changed from having a separate currency value, var decimalCount = decimals.length;
// to both being in value. Don't want to use previous currency value. if (decimalCount >= desiredFractionDigits) {
// Try to extract currency from value.. // Everything is OK.
var currencySplit = $scope.value.split(" "); return localizedString;
if (currencySplit.length === 2) { }
$scope.currency = currencySplit[1];
}
$scope.currency = $scope.currency || '';
var parsed = parseFloat($scope.value); if (typeof number !== 'number') {
var valueFormatted = ''; number = parseFloat(number);
var valueProcessing = ''; }
switch (getDecimalPlaces($scope.currency)) {
case '0': var fixed = number.toFixed(desiredFractionDigits);
if (isNaN(parsed)) { var fixedMatch = fractionalRe.exec(fixed);
buildAmount('-', '', ''); if (!fixedMatch || fixedMatch.length !== 3) {
} else { // Don't know what's happening, just return what we have
valueFormatted = localizeNumbers(Math.round(parsed), 0); return localizedString;
buildAmount(valueFormatted, '', ''); }
}
break;
case '3': // Keeps locale decimal separator.
var enough = match[1] + fixedMatch[2];
return enough;
}
function formatNumbers() {
// During watch, may be changed from having a separate currency value,
// to both being in value. Don't want to use previous currency value.
// Try to extract currency from value..
var currencySplit = $scope.value.split(" ");
if (currencySplit.length === 2) {
$scope.currency = currencySplit[1];
}
$scope.currency = $scope.currency || '';
var parsed = parseFloat($scope.value);
var valueFormatted = '';
var valueProcessing = '';
switch (getDecimalPlaces($scope.currency)) {
case '0':
if (isNaN(parsed)) { if (isNaN(parsed)) {
buildAmount('-' + getDecimalSeparator() + '---', '', ''); buildAmount('-', '', '');
} else { } else {
valueProcessing = parsed.toFixed(3); valueFormatted = localizeNumbers(Math.round(parsed), 0);
valueFormatted = localizeNumbers(valueProcessing, 3); buildAmount(valueFormatted, '', '');
buildAmount(valueFormatted, '', ''); }
} break;
break;
case '8': case '3':
if (isNaN(parsed)) { if (isNaN(parsed)) {
buildAmount('-' + getDecimalSeparator() + '---', '', ''); buildAmount('-' + getDecimalSeparator() + '---', '', '');
} else if (parsed === 0) { } else {
buildAmount('0', '', ''); valueProcessing = parsed.toFixed(3);
} else { valueFormatted = localizeNumbers(valueProcessing, 3);
valueFormatted = parsed.toFixed(8); buildAmount(valueFormatted, '', '');
valueFormatted = localizeNumbers(valueFormatted, 8); }
var start = valueFormatted.slice(0, -5); break;
var middle = valueFormatted.slice(-5, -2);
var end = valueFormatted.substr(valueFormatted.length - 2);
buildAmount(start, middle, end);
}
break;
default: // 2 case '8':
if (isNaN(parsed)) { if (isNaN(parsed)) {
buildAmount('-' + getDecimalSeparator() + '--', '', ''); buildAmount('-' + getDecimalSeparator() + '---', '', '');
} else { } else if (parsed === 0) {
valueProcessing = parseFloat(parsed.toFixed(2)); buildAmount('0', '', '');
valueFormatted = localizeNumbers(valueProcessing, 2); } else {
buildAmount(valueFormatted, '', ''); valueFormatted = parsed.toFixed(8);
} valueFormatted = localizeNumbers(valueFormatted, 8);
break; var start = valueFormatted.slice(0, -5);
} var middle = valueFormatted.slice(-5, -2);
$scope.canShow = true; var end = valueFormatted.substr(valueFormatted.length - 2);
buildAmount(start, middle, end);
}
break;
default: // 2
if (isNaN(parsed)) {
buildAmount('-' + getDecimalSeparator() + '--', '', '');
} else {
valueProcessing = parseFloat(parsed.toFixed(2));
valueFormatted = localizeNumbers(valueProcessing, 2);
buildAmount(valueFormatted, '', '');
}
break;
}
$scope.canShow = true;
};
function getDecimalPlaces(currency) {
if (decimalPlaces['0'].indexOf(currency.toUpperCase()) > -1) return '0';
if (decimalPlaces['3'].indexOf(currency.toUpperCase()) > -1) return '3';
if (decimalPlaces['8'].indexOf(currency.toUpperCase()) > -1) return '8';
return '2';
};
function getDecimalSeparator() {
var testNum = 1.5;
var testString = testNum.toLocaleString(uxLanguage.getCurrentLanguage());
// Some environments let you set decimal separators that are more than one character
var separator = /^1(.+)5$/.exec(testString)[1]
return separator;
};
function localizeNumbers(x, minimumFractionDigits) {
var parsed = parseFloat(x);
var opts = {
minimumFractionDigits: minimumFractionDigits,
useGrouping: true
}; };
var lang = uxLanguage.getCurrentLanguage();
function getDecimalPlaces(currency) { var localized = parsed.toLocaleString(lang, opts);
if (decimalPlaces['0'].indexOf(currency.toUpperCase()) > -1) return '0'; var corrected = ensureEnoughFractionDigits(localized, x, minimumFractionDigits);
if (decimalPlaces['3'].indexOf(currency.toUpperCase()) > -1) return '3'; return corrected;
if (decimalPlaces['8'].indexOf(currency.toUpperCase()) > -1) return '8'; };
return '2';
};
function getDecimalSeparator() {
var testNum = 1.5;
var testString = testNum.toLocaleString(uxLanguage.getCurrentLanguage());
// Some environments let you set decimal separators that are more than one character
var separator = /^1(.+)5$/.exec(testString)[1]
return separator;
};
function localizeNumbers(x, minimumFractionDigits) {
var parsed = parseFloat(x);
var opts = {
minimumFractionDigits: minimumFractionDigits,
useGrouping: true
};
var lang = uxLanguage.getCurrentLanguage();
var localized = parsed.toLocaleString(lang, opts);
var corrected = ensureEnoughFractionDigits(localized, x, minimumFractionDigits);
return corrected;
};
});
} }
})(); })();