Skip to content

Commit

Permalink
Merge pull request #42 from nightskylark/T591397
Browse files Browse the repository at this point in the history
Fix parsing arabic numerals
  • Loading branch information
nightskylark authored Dec 29, 2017
2 parents e3c2093 + 5c3685b commit ae65a9d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 14 deletions.
4 changes: 4 additions & 0 deletions src/number.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@ numberLocalization.inject({
var isExponentialRegexp = /^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)+$/,
legitDecimalSeparator = '.';

if(this.convertDigits) {
text = this.convertDigits(text, true);
}

if(isExponentialRegexp.test(text)) {
return text;
}
Expand Down
50 changes: 36 additions & 14 deletions tests/number-tests.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,29 @@
var QUnit = require('qunitjs');
var locale = require('devextreme/localization').locale;
var numberLocalization = require('devextreme/localization/number');
var dxVersion = require('devextreme/core/version');

require('../src/number');

[ 'de', 'en', 'ja', 'ru' ].forEach(function(localeId) {
var locales = [ 'de', 'en', 'ja', 'ru' ];
if(dxVersion >= '17.2.3') {
Array.prototype.push.apply(locales, [ 'ar' ]);
}
locales.forEach(function(localeId) {
var getIntlFormatter = function(format) {
return (new Intl.NumberFormat(localeId, format)).format;
};

var localizeDigits = function(string) {
return string && string.split('').map(function(sign) {
if(/[0-9]/.test(sign)) {
return getIntlFormatter()(Number(sign));
}

return sign;
}).join('');
};

QUnit.module('number - ' + localeId, {
beforeEach: function() {
locale(localeId);
Expand All @@ -19,9 +34,16 @@ require('../src/number');
});

QUnit.test('format', function(assert) {
var separator = localeId === 'de' || localeId === 'ru' ? ',' : '.';
var separators = {
de: ',',
ru: ',',
ar: '٫',
default: '.'
};
var separator = separators[localeId] || separators.default;

function getLocalizedFixedNumber(integerPart, fractionPart) {
return integerPart + separator + fractionPart;
return localizeDigits(integerPart + separator + fractionPart);
}
var assertData = [
{
Expand All @@ -34,17 +56,17 @@ require('../src/number');
useGrouping: false
}
},
{ value: 437, format: { type: 'decimal' }, expected: '437' },
{ value: 437, format: { type: 'decimal', precision: 5 }, expected: '00437' },
{ value: 2, format: { type: 'decimal', precision: 2 }, expected: '02' },
{ value: 12, format: { type: 'decimal', precision: 2 }, expected: '12' },
{ value: 2, format: { type: 'decimal', precision: 3 }, expected: '002' },
{ value: 12, format: { type: 'decimal', precision: 3 }, expected: '012' },
{ value: 123, format: { type: 'decimal', precision: 3 }, expected: '123' },

{ value: 12.345, format: 'fixedPoint', expected: '12' },
{ value: 12.345, format: { type: 'fixedPoint' }, expected: '12' },
{ value: 1, format: { type: 'fixedPoint', precision: null }, expected: '1' },
{ value: 437, format: { type: 'decimal' }, expected: localizeDigits('437') },
{ value: 437, format: { type: 'decimal', precision: 5 }, expected: localizeDigits('00437') },
{ value: 2, format: { type: 'decimal', precision: 2 }, expected: localizeDigits('02') },
{ value: 12, format: { type: 'decimal', precision: 2 }, expected: localizeDigits('12') },
{ value: 2, format: { type: 'decimal', precision: 3 }, expected: localizeDigits('002') },
{ value: 12, format: { type: 'decimal', precision: 3 }, expected: localizeDigits('012') },
{ value: 123, format: { type: 'decimal', precision: 3 }, expected: localizeDigits('123') },

{ value: 12.345, format: 'fixedPoint', expected: localizeDigits('12') },
{ value: 12.345, format: { type: 'fixedPoint' }, expected: localizeDigits('12') },
{ value: 1, format: { type: 'fixedPoint', precision: null }, expected: localizeDigits('1') },
{ value: 1.2, format: { type: 'fixedPoint', precision: null }, expected: getLocalizedFixedNumber(1, 2) },
{ value: 1.22, format: { type: 'fixedPoint', precision: null }, expected: getLocalizedFixedNumber(1, 22) },
{ value: 1.222, format: { type: 'fixedPoint', precision: null }, expected: getLocalizedFixedNumber(1, 222) },
Expand Down

0 comments on commit ae65a9d

Please sign in to comment.