blob: 62681a1b8c6a7a19ca081745f0f96dfcf17690e1 [file] [log] [blame]
/*
* Copyright (c) 2010-2019 BSI Business Systems Integration AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BSI Business Systems Integration AG - initial API and implementation
*/
import {DecimalFormat, RoundingMode} from '../../src/index';
import {LocaleSpecHelper} from '@eclipse-scout/testing';
describe('DecimalFormat', function() {
var locale;
var helper;
beforeEach(function() {
setFixtures(sandbox());
helper = new LocaleSpecHelper();
locale = helper.createLocale(LocaleSpecHelper.DEFAULT_LOCALE);
});
afterEach(function() {
locale = null;
});
describe('constructor', function() {
it('uses the pattern from the options', function() {
var decimalFormat = new DecimalFormat(locale, {
pattern: '###0.00'
});
expect(decimalFormat.pattern).toBe('###0.00');
});
it('if the options parameter is a string, it assumes it is the pattern', function() {
// mainly done to be consistent with the DateFormat.js
var decimalFormat = new DecimalFormat(locale, '###0.00');
expect(decimalFormat.pattern).toBe('###0.00');
});
});
describe('format', function() {
it('considers decimal separators', function() {
var decimalFormat = new DecimalFormat(locale, {
pattern: '###0.00'
});
expect(decimalFormat.format(null)).toBe(null);
expect(decimalFormat.format(0)).toBe('0.00');
expect(decimalFormat.format(0.000)).toBe('0.00');
expect(decimalFormat.format(1000.1234)).toBe('1000.12');
expect(decimalFormat.format(1000.1234)).toBe('1000.12');
expect(decimalFormat.format(56000.1234)).toBe('56000.12');
// Without digits before decimal point
decimalFormat = new DecimalFormat(locale, {
pattern: '.00'
});
expect(decimalFormat.format(0)).toBe('.00');
expect(decimalFormat.format(0.000)).toBe('.00');
expect(decimalFormat.format(1000.1234)).toBe('1000.12');
expect(decimalFormat.format(12345.6789)).toBe('12345.68'); // rounding
locale = helper.createLocale('de-DE');
decimalFormat = new DecimalFormat(locale, {
pattern: '###0.00'
});
expect(decimalFormat.format(0)).toBe('0,00');
expect(decimalFormat.format(0.000)).toBe('0,00');
expect(decimalFormat.format(1000.1234)).toBe('1000,12');
});
it('considers grouping separators', function() {
var decimalFormat = new DecimalFormat(locale, {
pattern: '#,##0.00'
});
expect(decimalFormat.format(0)).toBe('0.00');
expect(decimalFormat.format(10)).toBe('10.00');
expect(decimalFormat.format(100)).toBe('100.00');
expect(decimalFormat.format(1000.1234)).toBe('1\'000.12');
expect(decimalFormat.format(50121000.1234)).toBe('50\'121\'000.12');
expect(decimalFormat.format(100005121000.1234)).toBe('100\'005\'121\'000.12');
locale = helper.createLocale('de-DE');
decimalFormat = new DecimalFormat(locale, {
pattern: '#,##0.00'
});
expect(decimalFormat.format(0)).toBe('0,00');
expect(decimalFormat.format(10)).toBe('10,00');
expect(decimalFormat.format(100)).toBe('100,00');
expect(decimalFormat.format(1000.1234)).toBe('1.000,12');
expect(decimalFormat.format(50121000.1234)).toBe('50.121.000,12');
expect(decimalFormat.format(100005121000.1234)).toBe('100.005.121.000,12');
});
it('can swap the position of the minus sign', function() {
var decimalFormat = new DecimalFormat(locale, {
pattern: '0.0-' // Group separator after decimal separator, 0 after #
});
expect(decimalFormat.format(0)).toBe('0.0');
expect(decimalFormat.format(10)).toBe('10.0');
expect(decimalFormat.format(-14.234)).toBe('14.2-');
});
it('can handle invalid patterns', function() {
var decimalFormat = new DecimalFormat(locale, {
pattern: '#.##0,00' // Group separator after decimal separator, 0 after #
});
expect(decimalFormat.format(0)).toBe('.000');
expect(decimalFormat.format(10)).toBe('10.000');
expect(decimalFormat.format(50121000.1234)).toBe('50121000.1234');
expect(decimalFormat.format(50121000.1234567)).toBe('50121000.12346');
});
it('distinguishes digits and zero digits', function() {
var decimalFormat = new DecimalFormat(locale, {
pattern: '##0.#'
});
expect(decimalFormat.format(0)).toBe('0');
expect(decimalFormat.format(112)).toBe('112');
decimalFormat = new DecimalFormat(locale, {
pattern: '#.#'
});
expect(decimalFormat.format(0)).toBe('');
expect(decimalFormat.format(112)).toBe('112');
decimalFormat = new DecimalFormat(locale, {
pattern: '0000.0000'
});
expect(decimalFormat.format(1)).toBe('0001.0000');
expect(decimalFormat.format(125112)).toBe('125112.0000');
// patterns without separator:
decimalFormat = new DecimalFormat(locale, {
pattern: '#'
});
expect(decimalFormat.format(0)).toBe('');
expect(decimalFormat.format(112)).toBe('112');
decimalFormat = new DecimalFormat(locale, {
pattern: '0'
});
expect(decimalFormat.format(0)).toBe('0');
expect(decimalFormat.format(112)).toBe('112');
});
it('can handle positive and negative subpattern', function() {
var decimalFormat = new DecimalFormat(locale, {
pattern: '###0.00;minus 00.0#'
});
expect(decimalFormat.format(0)).toBe('0.00');
expect(decimalFormat.format(0.000)).toBe('0.00');
expect(decimalFormat.format(1000.1234)).toBe('1000.12');
expect(decimalFormat.format(12345.6789)).toBe('12345.68'); // rounding
expect(decimalFormat.format(-1)).toBe('minus 1.00'); // negative pattern is only used for prefix/suffix
expect(decimalFormat.format(-2.000)).toBe('minus 2.00');
expect(decimalFormat.format(-1000.1234)).toBe('minus 1000.12');
expect(decimalFormat.format(-12345.6789)).toBe('minus 12345.68');
// Formats positive numbers as negative and negative numbers as positive
decimalFormat = new DecimalFormat(locale, {
pattern: '-0.00;0.00'
});
expect(decimalFormat.format(12)).toBe('-12.00');
expect(decimalFormat.format(-924.566)).toBe('924.57');
// Normal mode, auto-insertion of minus sign
decimalFormat = new DecimalFormat(locale, {
pattern: '0.00'
});
expect(decimalFormat.format(12)).toBe('12.00');
expect(decimalFormat.format(-924.566)).toBe('-924.57');
// Prefix and minus sign position in front
decimalFormat = new DecimalFormat(locale, {
pattern: '-X0.00'
});
expect(decimalFormat.format(12)).toBe('X12.00');
expect(decimalFormat.format(-924.566)).toBe('-X924.57');
decimalFormat = new DecimalFormat(locale, {
pattern: 'X-0.00'
});
expect(decimalFormat.format(12)).toBe('X12.00');
expect(decimalFormat.format(-924.566)).toBe('X-924.57');
// Minus sign position at end
decimalFormat = new DecimalFormat(locale, {
pattern: '0.00-'
});
expect(decimalFormat.format(12)).toBe('12.00');
expect(decimalFormat.format(-924.566)).toBe('924.57-');
});
it('can handle exotic symbols', function() {
locale.decimalFormatSymbols.minusSign = 'M';
locale.decimalFormatSymbols.decimalSeparator = '!!';
locale.decimalFormatSymbols.groupingSeparator = '~';
var decimalFormat = new DecimalFormat(locale, {
pattern: '#,##0.00'
});
expect(decimalFormat.format(0)).toBe('0!!00');
expect(decimalFormat.format(0.000)).toBe('0!!00');
expect(decimalFormat.format(1000.1234)).toBe('1~000!!12');
expect(decimalFormat.format(12345.6789)).toBe('12~345!!68');
expect(decimalFormat.format(1234500.6789)).toBe('1~234~500!!68');
expect(decimalFormat.format(1234500.675)).toBe('1~234~500!!68');
expect(decimalFormat.format(-1234500.6789)).toBe('M1~234~500!!68');
expect(decimalFormat.format(-1234500.675)).toBe('M1~234~500!!68');
expect(decimalFormat.format(-1)).toBe('M1!!00');
});
it('can handle percentages, format taken from application', function() {
locale.decimalFormatSymbols.minusSign = 'M';
locale.decimalFormatSymbols.decimalSeparator = '!';
locale.decimalFormatSymbols.groupingSeparator = '~';
var decimalFormat = new DecimalFormat(locale, {
pattern: '#,##0.00\'%\''
});
expect(decimalFormat.format(0)).toBe('0!00%');
expect(decimalFormat.format(0.000)).toBe('0!00%');
expect(decimalFormat.format(0.111)).toBe('0!11%');
expect(decimalFormat.format(1000.1234)).toBe('1~000!12%');
expect(decimalFormat.format(12345.6789)).toBe('12~345!68%');
expect(decimalFormat.format(-1)).toBe('M1!00%');
});
it('can handle multiplier', function() {
locale.decimalFormatSymbols.minusSign = 'M';
locale.decimalFormatSymbols.decimalSeparator = '!';
locale.decimalFormatSymbols.groupingSeparator = '~';
var decimalFormat = new DecimalFormat(locale, {
pattern: '#,##0.00'
});
// positive multiplier
decimalFormat.multiplier = 10;
expect(decimalFormat.format(0)).toBe('0!00');
expect(decimalFormat.format(0.000)).toBe('0!00');
expect(decimalFormat.format(0.111)).toBe('1!11');
expect(decimalFormat.format(1000.1234)).toBe('10~001!23');
expect(decimalFormat.format(12345.6789)).toBe('123~456!79');
expect(decimalFormat.format(-1)).toBe('M10!00');
expect(decimalFormat.format(-1.002)).toBe('M10!02');
// negative multiplier
decimalFormat.multiplier = -10;
expect(decimalFormat.format(0)).toBe('0!00');
expect(decimalFormat.format(0.000)).toBe('0!00');
expect(decimalFormat.format(0.111)).toBe('M1!11');
expect(decimalFormat.format(1.002)).toBe('M10!02');
expect(decimalFormat.format(1000.1234)).toBe('M10~001!23');
expect(decimalFormat.format(12345.6789)).toBe('M123~456!79');
expect(decimalFormat.format(-1)).toBe('10!00');
expect(decimalFormat.format(-1.002)).toBe('10!02');
// rounding
decimalFormat = new DecimalFormat(locale, {
pattern: '##0',
multiplier: 100
});
expect(decimalFormat.round(0)).toBe(0);
expect(decimalFormat.round(0.000)).toBe(0);
expect(decimalFormat.round(0.1234)).toBe(0.12);
expect(decimalFormat.round(0.1298)).toBe(0.13);
expect(decimalFormat.round(1.0002)).toBe(1);
expect(decimalFormat.round(1000.1234)).toBe(1000.12);
expect(decimalFormat.round(12345.6789)).toBe(12345.68);
expect(decimalFormat.round(-1)).toBe(-1);
expect(decimalFormat.round(-1.002)).toBe(-1);
expect(decimalFormat.round(-1.008)).toBe(-1.01);
});
it('can handle rounding mode', function() {
locale.decimalFormatSymbols.minusSign = 'M';
locale.decimalFormatSymbols.decimalSeparator = '!';
locale.decimalFormatSymbols.groupingSeparator = '~';
var decimalFormat = new DecimalFormat(locale, {
pattern: '#,##0.00',
roundingMode: RoundingMode.CEILING
});
expect(decimalFormat.format(0)).toBe('0!00');
expect(decimalFormat.format(0.000)).toBe('0!00');
expect(decimalFormat.format(0.111)).toBe('0!12');
expect(decimalFormat.format(1000.1234)).toBe('1~000!13');
expect(decimalFormat.format(12345.6789)).toBe('12~345!68');
expect(decimalFormat.format(-0)).toBe('0!00');
expect(decimalFormat.format(-0.000)).toBe('0!00');
expect(decimalFormat.format(-0.111)).toBe('M0!11');
expect(decimalFormat.format(-1000.1234)).toBe('M1~000!12');
expect(decimalFormat.format(-12345.6789)).toBe('M12~345!67');
decimalFormat.allAfter = 0;
decimalFormat.pattern = '#,##0';
expect(decimalFormat.format(-1000.1234)).toBe('M1~000');
expect(decimalFormat.format(1000.1234)).toBe('1~001');
});
});
describe('round', function() {
it('can handle rounding modes', function() {
locale.decimalFormatSymbols.minusSign = 'M';
locale.decimalFormatSymbols.decimalSeparator = '!';
locale.decimalFormatSymbols.groupingSeparator = '~';
var decimalFormat = new DecimalFormat(locale, {
pattern: '#,##0.00',
roundingMode: RoundingMode.CEILING
});
expect(decimalFormat.round(0)).toBe(0);
expect(decimalFormat.round(1000.1234)).toBe(1000.13);
expect(decimalFormat.round(12345.6789)).toBe(12345.68);
expect(decimalFormat.round(-1000.1234)).toBe(-1000.12);
expect(decimalFormat.round(-12345.6789)).toBe(-12345.67);
});
});
});