Path: blob/master/test/jdk/java/text/Format/CompactNumberFormat/TestCompactNumber.java
41153 views
/*1* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/22/*23* @test24* @bug 8177552 8217721 822275625* @summary Checks the functioning of compact number format26* @modules jdk.localedata27* @run testng/othervm TestCompactNumber28*/29import java.math.BigDecimal;30import java.math.BigInteger;31import java.text.FieldPosition;32import java.text.Format;33import java.text.NumberFormat;34import java.text.ParseException;35import java.text.ParsePosition;36import java.util.Locale;37import java.util.stream.Stream;38import static org.testng.Assert.*;39import org.testng.annotations.DataProvider;40import org.testng.annotations.Test;4142public class TestCompactNumber {4344private static final NumberFormat FORMAT_DZ_LONG = NumberFormat45.getCompactNumberInstance(new Locale("dz"), NumberFormat.Style.LONG);4647private static final NumberFormat FORMAT_EN_US_SHORT = NumberFormat48.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);4950private static final NumberFormat FORMAT_EN_LONG = NumberFormat51.getCompactNumberInstance(new Locale("en"), NumberFormat.Style.LONG);5253private static final NumberFormat FORMAT_HI_IN_LONG = NumberFormat54.getCompactNumberInstance(new Locale("hi", "IN"), NumberFormat.Style.LONG);5556private static final NumberFormat FORMAT_JA_JP_SHORT = NumberFormat57.getCompactNumberInstance(Locale.JAPAN, NumberFormat.Style.SHORT);5859private static final NumberFormat FORMAT_IT_SHORT = NumberFormat60.getCompactNumberInstance(new Locale("it"), NumberFormat.Style.SHORT);6162private static final NumberFormat FORMAT_CA_LONG = NumberFormat63.getCompactNumberInstance(new Locale("ca"), NumberFormat.Style.LONG);6465private static final NumberFormat FORMAT_AS_LONG = NumberFormat66.getCompactNumberInstance(new Locale("as"), NumberFormat.Style.LONG);6768private static final NumberFormat FORMAT_BRX_SHORT = NumberFormat69.getCompactNumberInstance(new Locale("brx"), NumberFormat.Style.SHORT);7071private static final NumberFormat FORMAT_SW_LONG = NumberFormat72.getCompactNumberInstance(new Locale("sw"), NumberFormat.Style.LONG);7374private static final NumberFormat FORMAT_SE_SHORT = NumberFormat75.getCompactNumberInstance(new Locale("se"), NumberFormat.Style.SHORT);7677private static final NumberFormat FORMAT_DE_LONG = NumberFormat78.getCompactNumberInstance(Locale.GERMAN, NumberFormat.Style.LONG);7980private static final NumberFormat FORMAT_SL_LONG = NumberFormat81.getCompactNumberInstance(new Locale("sl"), NumberFormat.Style.LONG);8283@DataProvider(name = "format")84Object[][] compactFormatData() {85return new Object[][]{86// compact number format instance, number to format, formatted output87{FORMAT_DZ_LONG, 1000.09, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55"88+ "\u0FB2\u0F42 \u0F21"},89{FORMAT_DZ_LONG, -999.99, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55"90+ "\u0FB2\u0F42 \u0F21"},91{FORMAT_DZ_LONG, -0.0, "-\u0F20"},92{FORMAT_DZ_LONG, 3000L, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55"93+ "\u0FB2\u0F42 \u0F23"},94{FORMAT_DZ_LONG, new BigInteger("12345678901234567890"), "\u0F51"95+ "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66"96+ "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"},97// negative98{FORMAT_DZ_LONG, new BigInteger("-12345678901234567890"), "-\u0F51"99+ "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66"100+ "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"},101{FORMAT_DZ_LONG, new BigDecimal("12345678901234567890.89"), "\u0F51"102+ "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66"103+ "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"},104{FORMAT_DZ_LONG, new BigDecimal("-12345678901234567890.89"), "-\u0F51"105+ "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66"106+ "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"},107// Zeros108{FORMAT_EN_US_SHORT, 0, "0"},109{FORMAT_EN_US_SHORT, 0.0, "0"},110{FORMAT_EN_US_SHORT, -0.0, "-0"},111// Less than 1000 no suffix112{FORMAT_EN_US_SHORT, 499, "499"},113// Boundary number114{FORMAT_EN_US_SHORT, 1000.0, "1K"},115// Long116{FORMAT_EN_US_SHORT, 3000L, "3K"},117{FORMAT_EN_US_SHORT, 30000L, "30K"},118{FORMAT_EN_US_SHORT, 300000L, "300K"},119{FORMAT_EN_US_SHORT, 3000000L, "3M"},120{FORMAT_EN_US_SHORT, 30000000L, "30M"},121{FORMAT_EN_US_SHORT, 300000000L, "300M"},122{FORMAT_EN_US_SHORT, 3000000000L, "3B"},123{FORMAT_EN_US_SHORT, 30000000000L, "30B"},124{FORMAT_EN_US_SHORT, 300000000000L, "300B"},125{FORMAT_EN_US_SHORT, 3000000000000L, "3T"},126{FORMAT_EN_US_SHORT, 30000000000000L, "30T"},127{FORMAT_EN_US_SHORT, 300000000000000L, "300T"},128{FORMAT_EN_US_SHORT, 3000000000000000L, "3000T"},129// Negatives130{FORMAT_EN_US_SHORT, -3000L, "-3K"},131{FORMAT_EN_US_SHORT, -30000L, "-30K"},132{FORMAT_EN_US_SHORT, -300000L, "-300K"},133{FORMAT_EN_US_SHORT, -3000000L, "-3M"},134{FORMAT_EN_US_SHORT, -30000000L, "-30M"},135{FORMAT_EN_US_SHORT, -300000000L, "-300M"},136{FORMAT_EN_US_SHORT, -3000000000L, "-3B"},137{FORMAT_EN_US_SHORT, -30000000000L, "-30B"},138{FORMAT_EN_US_SHORT, -300000000000L, "-300B"},139{FORMAT_EN_US_SHORT, -3000000000000L, "-3T"},140{FORMAT_EN_US_SHORT, -30000000000000L, "-30T"},141{FORMAT_EN_US_SHORT, -300000000000000L, "-300T"},142{FORMAT_EN_US_SHORT, -3000000000000000L, "-3000T"},143// Double144{FORMAT_EN_US_SHORT, 3000.0, "3K"},145{FORMAT_EN_US_SHORT, 30000.0, "30K"},146{FORMAT_EN_US_SHORT, 300000.0, "300K"},147{FORMAT_EN_US_SHORT, 3000000.0, "3M"},148{FORMAT_EN_US_SHORT, 30000000.0, "30M"},149{FORMAT_EN_US_SHORT, 300000000.0, "300M"},150{FORMAT_EN_US_SHORT, 3000000000.0, "3B"},151{FORMAT_EN_US_SHORT, 30000000000.0, "30B"},152{FORMAT_EN_US_SHORT, 300000000000.0, "300B"},153{FORMAT_EN_US_SHORT, 3000000000000.0, "3T"},154{FORMAT_EN_US_SHORT, 30000000000000.0, "30T"},155{FORMAT_EN_US_SHORT, 300000000000000.0, "300T"},156{FORMAT_EN_US_SHORT, 3000000000000000.0, "3000T"},157// Negatives158{FORMAT_EN_US_SHORT, -3000.0, "-3K"},159{FORMAT_EN_US_SHORT, -30000.0, "-30K"},160{FORMAT_EN_US_SHORT, -300000.0, "-300K"},161{FORMAT_EN_US_SHORT, -3000000.0, "-3M"},162{FORMAT_EN_US_SHORT, -30000000.0, "-30M"},163{FORMAT_EN_US_SHORT, -300000000.0, "-300M"},164{FORMAT_EN_US_SHORT, -3000000000.0, "-3B"},165{FORMAT_EN_US_SHORT, -30000000000.0, "-30B"},166{FORMAT_EN_US_SHORT, -300000000000.0, "-300B"},167{FORMAT_EN_US_SHORT, -3000000000000.0, "-3T"},168{FORMAT_EN_US_SHORT, -30000000000000.0, "-30T"},169{FORMAT_EN_US_SHORT, -300000000000000.0, "-300T"},170{FORMAT_EN_US_SHORT, -3000000000000000.0, "-3000T"},171// BigInteger172{FORMAT_EN_US_SHORT, new BigInteger("12345678901234567890"),173"12345679T"},174{FORMAT_EN_US_SHORT, new BigInteger("-12345678901234567890"),175"-12345679T"},176//BigDecimal177{FORMAT_EN_US_SHORT, new BigDecimal("12345678901234567890.89"),178"12345679T"},179{FORMAT_EN_US_SHORT, new BigDecimal("-12345678901234567890.89"),180"-12345679T"},181{FORMAT_EN_US_SHORT, new BigDecimal("12345678901234567890123466767.89"),182"12345678901234568T"},183{FORMAT_EN_US_SHORT, new BigDecimal(184"12345678901234567890878732267863209.89"),185"12345678901234567890879T"},186// number as exponent187{FORMAT_EN_US_SHORT, 9.78313E+3, "10K"},188// Less than 1000 no suffix189{FORMAT_EN_LONG, 999, "999"},190// Round the value and then format191{FORMAT_EN_LONG, 999.99, "1 thousand"},192// 10 thousand193{FORMAT_EN_LONG, 99000, "99 thousand"},194// Long path195{FORMAT_EN_LONG, 330000, "330 thousand"},196// Double path197{FORMAT_EN_LONG, 3000.90, "3 thousand"},198// BigInteger path199{FORMAT_EN_LONG, new BigInteger("12345678901234567890"),200"12345679 trillion"},201//BigDecimal path202{FORMAT_EN_LONG, new BigDecimal("12345678901234567890.89"),203"12345679 trillion"},204// Less than 1000 no suffix205{FORMAT_HI_IN_LONG, -999, "-999"},206// Round the value with 0 fraction digits and format it207{FORMAT_HI_IN_LONG, -999.99, "-1 \u0939\u091C\u093C\u093E\u0930"},208// 10 thousand209{FORMAT_HI_IN_LONG, 99000, "99 \u0939\u091C\u093C\u093E\u0930"},210// Long path211{FORMAT_HI_IN_LONG, 330000, "3 \u0932\u093E\u0916"},212// Double path213{FORMAT_HI_IN_LONG, 3000.90, "3 \u0939\u091C\u093C\u093E\u0930"},214// BigInteger path215{FORMAT_HI_IN_LONG, new BigInteger("12345678901234567890"),216"123456789 \u0916\u0930\u092C"},217// BigDecimal path218{FORMAT_HI_IN_LONG, new BigDecimal("12345678901234567890.89"),219"123456789 \u0916\u0930\u092C"},220// 1000 does not have any suffix in "ja" locale221{FORMAT_JA_JP_SHORT, -999.99, "-1,000"},222// 0-9999 does not have any suffix223{FORMAT_JA_JP_SHORT, 9999, "9,999"},224// 99000/10000 => 9.9\u4E07 rounded to 10\u4E07225{FORMAT_JA_JP_SHORT, 99000, "10\u4E07"},226// Negative227{FORMAT_JA_JP_SHORT, -99000, "-10\u4E07"},228// Long path229{FORMAT_JA_JP_SHORT, 330000, "33\u4E07"},230// Double path231{FORMAT_JA_JP_SHORT, 3000.90, "3,001"},232// BigInteger path233{FORMAT_JA_JP_SHORT, new BigInteger("12345678901234567890"),234"12345679\u5146"},235// BigDecimal path236{FORMAT_JA_JP_SHORT, new BigDecimal("12345678901234567890.89"),237"12345679\u5146"},238// less than 1000 no suffix239{FORMAT_IT_SHORT, 499, "499"},240// Boundary number241{FORMAT_IT_SHORT, 1000, "1.000"},242// Long path243{FORMAT_IT_SHORT, 3000000L, "3\u00a0Mln"},244// Double path245{FORMAT_IT_SHORT, 3000000.0, "3\u00a0Mln"},246// BigInteger path247{FORMAT_IT_SHORT, new BigInteger("12345678901234567890"),248"12345679\u00a0Bln"},249// BigDecimal path250{FORMAT_IT_SHORT, new BigDecimal("12345678901234567890.89"),251"12345679\u00a0Bln"},252{FORMAT_CA_LONG, 999, "999"},253{FORMAT_CA_LONG, 999.99, "1 miler"},254{FORMAT_CA_LONG, 99000, "99 milers"},255{FORMAT_CA_LONG, 330000, "330 milers"},256{FORMAT_CA_LONG, 3000.90, "3 milers"},257{FORMAT_CA_LONG, 1000000, "1 mili\u00f3"},258{FORMAT_CA_LONG, new BigInteger("12345678901234567890"),259"12345679 bilions"},260{FORMAT_CA_LONG, new BigDecimal("12345678901234567890.89"),261"12345679 bilions"},262{FORMAT_AS_LONG, 5000.0, "\u09eb \u09b9\u09be\u099c\u09be\u09f0"},263{FORMAT_AS_LONG, 50000.0, "\u09eb\u09e6 \u09b9\u09be\u099c\u09be\u09f0"},264{FORMAT_AS_LONG, 500000.0, "\u09eb \u09b2\u09be\u0996"},265{FORMAT_AS_LONG, 5000000.0, "\u09eb \u09a8\u09bf\u09af\u09c1\u09a4"},266{FORMAT_AS_LONG, 50000000.0, "\u09eb\u09e6 \u09a8\u09bf\u09af\u09c1\u09a4"},267{FORMAT_AS_LONG, 500000000.0, "\u09eb\u09e6\u09e6 \u09a8\u09bf\u09af\u09c1\u09a4"},268{FORMAT_AS_LONG, 5000000000.0, "\u09eb \u09b6\u09a4 \u0995\u09cb\u099f\u09bf"},269{FORMAT_AS_LONG, 50000000000.0, "\u09eb\u09e6 \u09b6\u09a4 \u0995\u09cb\u099f\u09bf"},270{FORMAT_AS_LONG, 500000000000.0, "\u09eb\u09e6\u09e6 \u09b6\u09a4 \u0995\u09cb\u099f\u09bf"},271{FORMAT_AS_LONG, 5000000000000.0, "\u09eb \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"},272{FORMAT_AS_LONG, 50000000000000.0, "\u09eb\u09e6 \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"},273{FORMAT_AS_LONG, 500000000000000.0, "\u09eb\u09e6\u09e6 \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"},274{FORMAT_AS_LONG, 5000000000000000.0, "\u09eb\u09e6\u09e6\u09e6 \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"},275{FORMAT_AS_LONG, new BigInteger("12345678901234567890"),276"\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ef \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"},277{FORMAT_AS_LONG, new BigDecimal("12345678901234567890123466767.89"),278"\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ee \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"},279{FORMAT_BRX_SHORT, 999, "999"},280{FORMAT_BRX_SHORT, 999.99, "1K"},281{FORMAT_BRX_SHORT, 99000, "99K"},282{FORMAT_BRX_SHORT, 330000, "330K"},283{FORMAT_BRX_SHORT, 3000.90, "3K"},284{FORMAT_BRX_SHORT, 1000000, "1M"},285{FORMAT_BRX_SHORT, new BigInteger("12345678901234567890"),286"12345679T"},287{FORMAT_BRX_SHORT, new BigDecimal("12345678901234567890.89"),288"12345679T"},289// Less than 1000 no suffix290{FORMAT_SW_LONG, 499, "499"},291// Boundary number292{FORMAT_SW_LONG, 1000, "elfu 1"},293// Long path294{FORMAT_SW_LONG, 3000000L, "milioni 3"},295// Long path, negative296{FORMAT_SW_LONG, -3000000L, "milioni -3"},297// Double path298{FORMAT_SW_LONG, 3000000.0, "milioni 3"},299// Double path, negative300{FORMAT_SW_LONG, -3000000.0, "milioni -3"},301// BigInteger path302{FORMAT_SW_LONG, new BigInteger("12345678901234567890"),303"trilioni 12345679"},304// BigDecimal path305{FORMAT_SW_LONG, new BigDecimal("12345678901234567890.89"),306"trilioni 12345679"},307// Positives308// No compact form309{FORMAT_SE_SHORT, 999, "999"},310// Long311{FORMAT_SE_SHORT, 8000000L, "8\u00a0mn"},312// Double313{FORMAT_SE_SHORT, 8000.98, "8\u00a0dt"},314// Big integer315{FORMAT_SE_SHORT, new BigInteger("12345678901234567890"), "12345679\u00a0bn"},316// Big decimal317{FORMAT_SE_SHORT, new BigDecimal("12345678901234567890.98"), "12345679\u00a0bn"},318// Negatives319// No compact form320{FORMAT_SE_SHORT, -999, "\u2212999"},321// Long322{FORMAT_SE_SHORT, -8000000L, "\u22128\u00a0mn"},323// Double324{FORMAT_SE_SHORT, -8000.98, "\u22128\u00a0dt"},325// BigInteger326{FORMAT_SE_SHORT, new BigInteger("-12345678901234567890"), "\u221212345679\u00a0bn"},327// BigDecimal328{FORMAT_SE_SHORT, new BigDecimal("-12345678901234567890.98"), "\u221212345679\u00a0bn"},329330// Plurals331// DE: one:i = 1 and v = 0332{FORMAT_DE_LONG, 1_000_000, "1 Million"},333{FORMAT_DE_LONG, 2_000_000, "2 Millionen"},334// SL: one:v = 0 and i % 100 = 1335// two:v = 0 and i % 100 = 2336// few:v = 0 and i % 100 = 3..4 or v != 0337{FORMAT_SL_LONG, 1_000_000, "1 milijon"},338{FORMAT_SL_LONG, 2_000_000, "2 milijona"},339{FORMAT_SL_LONG, 3_000_000, "3 milijone"},340{FORMAT_SL_LONG, 5_000_000, "5 milijonov"},341};342}343344@DataProvider(name = "parse")345Object[][] compactParseData() {346return new Object[][]{347// compact number format instance, string to parse, parsed number, return type348{FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2"349+ "\u0F42 \u0F21", 1000L, Long.class},350{FORMAT_DZ_LONG, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2"351+ "\u0F42 \u0F23", -3000L, Long.class},352{FORMAT_DZ_LONG, "\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62"353+ "\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21"354+ "\u0F22\u0F23\u0F24\u0F25\u0F27", 1.23457E19, Double.class},355{FORMAT_DZ_LONG, "-\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62"356+ "\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21"357+ "\u0F22\u0F23\u0F24\u0F25\u0F27", -1.23457E19, Double.class},358{FORMAT_EN_US_SHORT, "-0.0", -0.0, Double.class},359{FORMAT_EN_US_SHORT, "-0", -0.0, Double.class},360{FORMAT_EN_US_SHORT, "0", 0L, Long.class},361{FORMAT_EN_US_SHORT, "499", 499L, Long.class},362{FORMAT_EN_US_SHORT, "-499", -499L, Long.class},363{FORMAT_EN_US_SHORT, "499.89", 499.89, Double.class},364{FORMAT_EN_US_SHORT, "-499.89", -499.89, Double.class},365{FORMAT_EN_US_SHORT, "1K", 1000L, Long.class},366{FORMAT_EN_US_SHORT, "-1K", -1000L, Long.class},367{FORMAT_EN_US_SHORT, "3K", 3000L, Long.class},368{FORMAT_EN_US_SHORT, "17K", 17000L, Long.class},369{FORMAT_EN_US_SHORT, "-17K", -17000L, Long.class},370{FORMAT_EN_US_SHORT, "-3K", -3000L, Long.class},371{FORMAT_EN_US_SHORT, "12345678901234567890", 1.2345678901234567E19, Double.class},372{FORMAT_EN_US_SHORT, "12345679T", 1.2345679E19, Double.class},373{FORMAT_EN_US_SHORT, "-12345679T", -1.2345679E19, Double.class},374{FORMAT_EN_US_SHORT, "599.01K", 599010L, Long.class},375{FORMAT_EN_US_SHORT, "-599.01K", -599010L, Long.class},376{FORMAT_EN_US_SHORT, "599444444.90T", 5.994444449E20, Double.class},377{FORMAT_EN_US_SHORT, "-599444444.90T", -5.994444449E20, Double.class},378{FORMAT_EN_US_SHORT, "123456789012345.5678K", 123456789012345568L, Long.class},379{FORMAT_EN_US_SHORT, "17.000K", 17000L, Long.class},380{FORMAT_EN_US_SHORT, "123.56678K", 123566.78000, Double.class},381{FORMAT_EN_US_SHORT, "-123.56678K", -123566.78000, Double.class},382{FORMAT_EN_LONG, "999", 999L, Long.class},383{FORMAT_EN_LONG, "1 thousand", 1000L, Long.class},384{FORMAT_EN_LONG, "3 thousand", 3000L, Long.class},385{FORMAT_EN_LONG, "12345679 trillion", 1.2345679E19, Double.class},386{FORMAT_HI_IN_LONG, "999", 999L, Long.class},387{FORMAT_HI_IN_LONG, "-999", -999L, Long.class},388{FORMAT_HI_IN_LONG, "1 \u0939\u091C\u093C\u093E\u0930", 1000L, Long.class},389{FORMAT_HI_IN_LONG, "-1 \u0939\u091C\u093C\u093E\u0930", -1000L, Long.class},390{FORMAT_HI_IN_LONG, "3 \u0939\u091C\u093C\u093E\u0930", 3000L, Long.class},391{FORMAT_HI_IN_LONG, "12345679 \u0916\u0930\u092C", 1234567900000000000L, Long.class},392{FORMAT_HI_IN_LONG, "-12345679 \u0916\u0930\u092C", -1234567900000000000L, Long.class},393{FORMAT_JA_JP_SHORT, "-99", -99L, Long.class},394{FORMAT_JA_JP_SHORT, "1\u4E07", 10000L, Long.class},395{FORMAT_JA_JP_SHORT, "30\u4E07", 300000L, Long.class},396{FORMAT_JA_JP_SHORT, "-30\u4E07", -300000L, Long.class},397{FORMAT_JA_JP_SHORT, "12345679\u5146", 1.2345679E19, Double.class},398{FORMAT_JA_JP_SHORT, "-12345679\u5146", -1.2345679E19, Double.class},399{FORMAT_IT_SHORT, "-99", -99L, Long.class},400{FORMAT_IT_SHORT, "1\u00a0Mln", 1000000L, Long.class},401{FORMAT_IT_SHORT, "30\u00a0Mln", 30000000L, Long.class},402{FORMAT_IT_SHORT, "-30\u00a0Mln", -30000000L, Long.class},403{FORMAT_IT_SHORT, "12345679\u00a0Bln", 1.2345679E19, Double.class},404{FORMAT_IT_SHORT, "-12345679\u00a0Bln", -1.2345679E19, Double.class},405{FORMAT_SW_LONG, "-0.0", -0.0, Double.class},406{FORMAT_SW_LONG, "499", 499L, Long.class},407{FORMAT_SW_LONG, "elfu 1", 1000L, Long.class},408{FORMAT_SW_LONG, "elfu 3", 3000L, Long.class},409{FORMAT_SW_LONG, "elfu 17", 17000L, Long.class},410{FORMAT_SW_LONG, "elfu -3", -3000L, Long.class},411{FORMAT_SW_LONG, "499", 499L, Long.class},412{FORMAT_SW_LONG, "-499", -499L, Long.class},413{FORMAT_SW_LONG, "elfu 1", 1000L, Long.class},414{FORMAT_SW_LONG, "elfu 3", 3000L, Long.class},415{FORMAT_SW_LONG, "elfu -3", -3000L, Long.class},416{FORMAT_SW_LONG, "elfu 17", 17000L, Long.class},417{FORMAT_SW_LONG, "trilioni 12345679", 1.2345679E19, Double.class},418{FORMAT_SW_LONG, "trilioni -12345679", -1.2345679E19, Double.class},419{FORMAT_SW_LONG, "elfu 599.01", 599010L, Long.class},420{FORMAT_SW_LONG, "elfu -599.01", -599010L, Long.class},421{FORMAT_SE_SHORT, "999", 999L, Long.class},422{FORMAT_SE_SHORT, "8\u00a0mn", 8000000L, Long.class},423{FORMAT_SE_SHORT, "8\u00a0dt", 8000L, Long.class},424{FORMAT_SE_SHORT, "12345679\u00a0bn", 1.2345679E19, Double.class},425{FORMAT_SE_SHORT, "12345679,89\u00a0bn", 1.2345679890000001E19, Double.class},426{FORMAT_SE_SHORT, "\u2212999", -999L, Long.class},427{FORMAT_SE_SHORT, "\u22128\u00a0mn", -8000000L, Long.class},428{FORMAT_SE_SHORT, "\u22128\u00a0dt", -8000L, Long.class},429{FORMAT_SE_SHORT, "\u221212345679\u00a0bn", -1.2345679E19, Double.class},430{FORMAT_SE_SHORT, "\u221212345679,89\u00a0bn", -1.2345679890000001E19, Double.class},431432// Plurals433// DE: one:i = 1 and v = 0434{FORMAT_DE_LONG, "1 Million", 1_000_000L, Long.class},435{FORMAT_DE_LONG, "2 Millionen", 2_000_000L, Long.class},436// SL: one:v = 0 and i % 100 = 1437// two:v = 0 and i % 100 = 2438// few:v = 0 and i % 100 = 3..4 or v != 0439{FORMAT_SL_LONG, "1 milijon", 1_000_000L, Long.class},440{FORMAT_SL_LONG, "2 milijona", 2_000_000L, Long.class},441{FORMAT_SL_LONG, "3 milijone", 3_000_000L, Long.class},442{FORMAT_SL_LONG, "5 milijonov", 5_000_000L, Long.class},443};444}445446@DataProvider(name = "exceptionParse")447Object[][] exceptionParseData() {448return new Object[][]{449// compact number instance, string to parse, null (no o/p; must throws exception)450// no number451{FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2"452+ "\u0F42", null},453// Invalid prefix454{FORMAT_DZ_LONG, "-\u0F66\u0F9F\u0F7C\u0F44,\u0F0B\u0F55\u0FB2"455+ "\u0F42 \u0F23", null},456// Invalid prefix for en_US457{FORMAT_EN_US_SHORT, "K12,347", null},458// Invalid prefix for ja_JP459{FORMAT_JA_JP_SHORT, "\u4E071", null},460// Localized minus sign should be used461{FORMAT_SE_SHORT, "-8\u00a0mn", null},};462}463464@DataProvider(name = "invalidParse")465Object[][] invalidParseData() {466return new Object[][]{467// compact number instance, string to parse, parsed number468// Prefix and suffix do not match469{FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2"470+ "\u0F42 \u0F21 KM", 1000L},471// Exponents are unparseable472{FORMAT_EN_US_SHORT, "-1.05E4K", -1.05},473// Default instance does not allow grouping474{FORMAT_EN_US_SHORT, "12,347", 12L},475// Take partial suffix "K" as 1000 for en_US_SHORT patterns476{FORMAT_EN_US_SHORT, "12KM", 12000L},477// Invalid suffix478{FORMAT_HI_IN_LONG, "-1 \u00a0\u0915.", -1L},479480// invalid plurals481{FORMAT_DE_LONG, "2 Million", 2L},482{FORMAT_SL_LONG, "2 milijon", 2L},483{FORMAT_SL_LONG, "2 milijone", 2L},484{FORMAT_SL_LONG, "2 milijonv", 2L},485{FORMAT_SL_LONG, "3 milijon", 3L},486{FORMAT_SL_LONG, "3 milijona", 3L},487{FORMAT_SL_LONG, "3 milijonv", 3L},488{FORMAT_SL_LONG, "5 milijon", 5L},489{FORMAT_SL_LONG, "5 milijona", 5L},490{FORMAT_SL_LONG, "5 milijone", 5L},491};492}493494@DataProvider(name = "fieldPosition")495Object[][] formatFieldPositionData() {496return new Object[][]{497//compact number instance, number to format, field, start position, end position, formatted string498{FORMAT_DZ_LONG, -3500, NumberFormat.Field.SIGN, 0, 1, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"},499{FORMAT_DZ_LONG, 3500, NumberFormat.Field.INTEGER, 9, 10, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"},500{FORMAT_DZ_LONG, -3500, NumberFormat.Field.INTEGER, 10, 11, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"},501{FORMAT_DZ_LONG, 999, NumberFormat.Field.INTEGER, 0, 3, "\u0F29\u0F29\u0F29"},502{FORMAT_DZ_LONG, -999, NumberFormat.Field.INTEGER, 1, 4, "-\u0F29\u0F29\u0F29"},503{FORMAT_DZ_LONG, 3500, NumberFormat.Field.PREFIX, 0, 9, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"},504{FORMAT_DZ_LONG, -3500, NumberFormat.Field.PREFIX, 0, 10, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"},505{FORMAT_DZ_LONG, 999, NumberFormat.Field.PREFIX, 0, 0, "\u0F29\u0F29\u0F29"},506{FORMAT_EN_US_SHORT, -3500, NumberFormat.Field.SIGN, 0, 1, "-4K"},507{FORMAT_EN_US_SHORT, 3500, NumberFormat.Field.INTEGER, 0, 1, "4K"},508{FORMAT_EN_US_SHORT, 14900000067L, NumberFormat.Field.INTEGER, 0, 2, "15B"},509{FORMAT_EN_US_SHORT, -1000, NumberFormat.Field.PREFIX, 0, 1, "-1K"},510{FORMAT_EN_US_SHORT, 3500, NumberFormat.Field.SUFFIX, 1, 2, "4K"},511{FORMAT_EN_US_SHORT, 14900000067L, NumberFormat.Field.SUFFIX, 2, 3, "15B"},512{FORMAT_EN_LONG, 3500, NumberFormat.Field.INTEGER, 0, 1, "4 thousand"},513{FORMAT_EN_LONG, 14900000067L, NumberFormat.Field.INTEGER, 0, 2, "15 billion"},514{FORMAT_EN_LONG, 3500, NumberFormat.Field.SUFFIX, 1, 10, "4 thousand"},515{FORMAT_EN_LONG, 14900000067L, NumberFormat.Field.SUFFIX, 2, 10, "15 billion"},516{FORMAT_JA_JP_SHORT, 14900000067L, NumberFormat.Field.INTEGER, 0, 3, "149\u5104"},517{FORMAT_JA_JP_SHORT, -999.99, NumberFormat.Field.INTEGER, 1, 6, "-1,000"},518{FORMAT_JA_JP_SHORT, 14900000067L, NumberFormat.Field.SUFFIX, 3, 4, "149\u5104"},519{FORMAT_JA_JP_SHORT, -999.99, NumberFormat.Field.SUFFIX, 0, 0, "-1,000"},520{FORMAT_JA_JP_SHORT, -999.99, NumberFormat.Field.SIGN, 0, 1, "-1,000"},521{FORMAT_HI_IN_LONG, -14900000067L, NumberFormat.Field.SIGN, 0, 1,522"-15 \u0905\u0930\u092C"},523{FORMAT_HI_IN_LONG, 3500, NumberFormat.Field.INTEGER, 0, 1,524"4 \u0939\u091C\u093C\u093E\u0930"},525{FORMAT_HI_IN_LONG, 14900000067L, NumberFormat.Field.INTEGER, 0, 2,526"15 \u0905\u0930\u092C"},527{FORMAT_HI_IN_LONG, 3500, NumberFormat.Field.SUFFIX, 1, 7,528"4 \u0939\u091C\u093C\u093E\u0930"},529{FORMAT_HI_IN_LONG, 14900000067L, NumberFormat.Field.SUFFIX, 2, 6,530"15 \u0905\u0930\u092C"},531{FORMAT_SE_SHORT, 8000000L, NumberFormat.Field.SUFFIX, 1, 4, "8\u00a0mn"},532{FORMAT_SE_SHORT, 8000.98, NumberFormat.Field.SUFFIX, 1, 4, "8\u00a0dt"},533{FORMAT_SE_SHORT, new BigInteger("12345678901234567890"), NumberFormat.Field.SUFFIX, 8, 11, "12345679\u00a0bn"},534{FORMAT_SE_SHORT, new BigDecimal("12345678901234567890.98"), NumberFormat.Field.SUFFIX, 8, 11, "12345679\u00a0bn"},535{FORMAT_SE_SHORT, -8000000L, NumberFormat.Field.INTEGER, 1, 2, "\u22128\u00a0mn"},536{FORMAT_SE_SHORT, -8000.98, NumberFormat.Field.SIGN, 0, 1, "\u22128\u00a0dt"},537{FORMAT_SE_SHORT, new BigDecimal("-48982865901234567890.98"), NumberFormat.Field.INTEGER, 1, 9, "\u221248982866\u00a0bn"},};538}539540@DataProvider(name = "varParsePosition")541Object[][] varParsePosition() {542return new Object[][]{543// compact number instance, parse string, parsed number,544// start position, end position, error index545{FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2"546+ "\u0F42 \u0F21 KM", 1000L, 0, 10, -1},547// Invalid prefix returns null548{FORMAT_DZ_LONG, "Number is: -\u0F66\u0F9F\u0F7C\u0F44,\u0F0B\u0F55\u0FB2"549+ "\u0F42 \u0F23", null, 11, 11, 11},550// Returns null551{FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2"552+ "\u0F42", null, 0, 0, 0},553{FORMAT_EN_US_SHORT, "Exponent: -1.05E4K", -1.05, 10, 15, -1},554// Default instance does not allow grouping555{FORMAT_EN_US_SHORT, "12,347", 12L, 0, 2, -1},556// Invalid suffix "KM" for en_US_SHORT patterns557{FORMAT_EN_US_SHORT, "12KM", 12000L, 0, 3, -1},558// Invalid suffix559{FORMAT_HI_IN_LONG, "-1 \u00a0\u0915.", -1L, 0, 2, -1},560{FORMAT_EN_LONG, "Number is: 12345679 trillion",5611.2345679E19, 11, 28, -1},562{FORMAT_EN_LONG, "Number is: -12345679 trillion",563-1.2345679E19, 11, 29, -1},564{FORMAT_EN_LONG, "parse 12 thousand and four", 12000L, 6, 17, -1},};565}566567@Test568public void testInstanceCreation() {569Stream.of(NumberFormat.getAvailableLocales()).forEach(l -> NumberFormat570.getCompactNumberInstance(l, NumberFormat.Style.SHORT).format(10000));571Stream.of(NumberFormat.getAvailableLocales()).forEach(l -> NumberFormat572.getCompactNumberInstance(l, NumberFormat.Style.LONG).format(10000));573}574575@Test(expectedExceptions = IllegalArgumentException.class)576public void testFormatWithNullParam() {577FORMAT_EN_US_SHORT.format(null);578}579580@Test(dataProvider = "format")581public void testFormat(NumberFormat cnf, Object number,582String expected) {583CompactFormatAndParseHelper.testFormat(cnf, number, expected);584}585586@Test(dataProvider = "parse")587public void testParse(NumberFormat cnf, String parseString,588Number expected, Class<? extends Number> returnType) throws ParseException {589CompactFormatAndParseHelper.testParse(cnf, parseString, expected, null, returnType);590}591592@Test(dataProvider = "parse")593public void testParsePosition(NumberFormat cnf, String parseString,594Number expected, Class<? extends Number> returnType) throws ParseException {595ParsePosition pos = new ParsePosition(0);596CompactFormatAndParseHelper.testParse(cnf, parseString, expected, pos, returnType);597assertEquals(pos.getIndex(), parseString.length());598assertEquals(pos.getErrorIndex(), -1);599}600601@Test(dataProvider = "varParsePosition")602public void testVarParsePosition(NumberFormat cnf, String parseString,603Number expected, int startPosition, int indexPosition,604int errPosition) throws ParseException {605ParsePosition pos = new ParsePosition(startPosition);606CompactFormatAndParseHelper.testParse(cnf, parseString, expected, pos, null);607assertEquals(pos.getIndex(), indexPosition);608assertEquals(pos.getErrorIndex(), errPosition);609}610611@Test(dataProvider = "exceptionParse", expectedExceptions = ParseException.class)612public void throwsParseException(NumberFormat cnf, String parseString,613Number expected) throws ParseException {614CompactFormatAndParseHelper.testParse(cnf, parseString, expected, null, null);615}616617@Test(dataProvider = "invalidParse")618public void testInvalidParse(NumberFormat cnf, String parseString,619Number expected) throws ParseException {620CompactFormatAndParseHelper.testParse(cnf, parseString, expected, null, null);621}622623@Test(dataProvider = "fieldPosition")624public void testFormatWithFieldPosition(NumberFormat nf,625Object number, Format.Field field, int posStartExpected,626int posEndExpected, String expected) {627FieldPosition pos = new FieldPosition(field);628StringBuffer buf = new StringBuffer();629StringBuffer result = nf.format(number, buf, pos);630assertEquals(result.toString(), expected, "Incorrect formatting of the number '"631+ number + "'");632assertEquals(pos.getBeginIndex(), posStartExpected, "Incorrect start position"633+ " while formatting the number '" + number + "', for the field " + field);634assertEquals(pos.getEndIndex(), posEndExpected, "Incorrect end position"635+ " while formatting the number '" + number + "', for the field " + field);636}637638}639640641