1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */ 2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others. 3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* 5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ******************************************************************************* 6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Copyright (C) 1996-2015, International Business Machines Corporation and * 7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved. * 8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ******************************************************************************* 9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.test.format; 11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.math.BigInteger; 13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.text.ParseException; 14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale; 15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Random; 16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 17f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubertimport org.junit.Test; 1805fa7802d0874812c234a29745586677ee5837eaFredrik Roubertimport org.junit.runner.RunWith; 1905fa7802d0874812c234a29745586677ee5837eaFredrik Roubertimport org.junit.runners.JUnit4; 20f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert 21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.dev.test.TestFmwk; 22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.math.BigDecimal; 23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.DecimalFormat; 24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.DecimalFormatSymbols; 25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.DisplayContext; 26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.NumberFormat; 27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.RuleBasedNumberFormat; 28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.util.ULocale; 292e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillinimport android.icu.testsharding.MainTestShard; 30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/** 32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * This does not test lenient parse mode, since testing the default implementation 33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * introduces a dependency on collation. See RbnfLenientScannerTest. 34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 352e13a2bdade5cd0a635f0bd89805931a6fd710daPete Gillin@MainTestShard 3605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert@RunWith(JUnit4.class) 37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic class RbnfTest extends TestFmwk { 38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static String fracRules = 39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "%main:\n" + 40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // this rule formats the number if it's 1 or more. It formats 41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // the integral part using a DecimalFormat ("#,##0" puts 42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // thousands separators in the right places) and the fractional 43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // part using %%frac. If there is no fractional part, it 44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // just shows the integral part. 45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " x.0: <#,##0<[ >%%frac>];\n" + 46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // this rule formats the number if it's between 0 and 1. It 47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // shows only the fractional part (0.5 shows up as "1/2," not 48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // "0 1/2") 49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 0.x: >%%frac>;\n" + 50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // the fraction rule set. This works the same way as the one in the 51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // preceding example: We multiply the fractional part of the number 52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // being formatted by each rule's base value and use the rule that 53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // produces the result closest to 0 (or the first rule that produces 0). 54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Since we only provide rules for the numbers from 2 to 10, we know 55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // we'll get a fraction with a denominator between 2 and 10. 56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // "<0<" causes the numerator of the fraction to be formatted 57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // using numerals 58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "%%frac:\n" + 59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 2: 1/2;\n" + 60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 3: <0</3;\n" + 61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 4: <0</4;\n" + 62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 5: <0</5;\n" + 63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 6: <0</6;\n" + 64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 7: <0</7;\n" + 65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 8: <0</8;\n" + 66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 9: <0</9;\n" + 67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 10: <0</10;\n"; 68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 69f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestCoverage() { 71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String durationInSecondsRules = 72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // main rule set for formatting with words 73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "%with-words:\n" 74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // take care of singular and plural forms of "second" 75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0 seconds; 1 second; =0= seconds;\n" 76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // use %%min to format values greater than 60 seconds 77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60/60: <%%min<[, >>];\n" 78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // use %%hr to format values greater than 3,600 seconds 79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // (the ">>>" below causes us to see the number of minutes 80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // when when there are zero minutes) 81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 3600/60: <%%hr<[, >>>];\n" 82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // this rule set takes care of the singular and plural forms 83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // of "minute" 84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%min:\n" 85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0 minutes; 1 minute; =0= minutes;\n" 86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // this rule set takes care of the singular and plural forms 87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // of "hour" 88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%hr:\n" 89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0 hours; 1 hour; =0= hours;\n" 90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // main rule set for formatting in numerals 92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%in-numerals:\n" 93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // values below 60 seconds are shown with "sec." 94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " =0= sec.;\n" 95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // higher values are shown with colons: %%min-sec is used for 96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // values below 3,600 seconds... 97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60: =%%min-sec=;\n" 98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // ...and %%hr-min-sec is used for values of 3,600 seconds 99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // and above 100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 3600: =%%hr-min-sec=;\n" 101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // this rule causes values of less than 10 minutes to show without 102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // a leading zero 103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%min-sec:\n" 104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0: :=00=;\n" 105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60/60: <0<>>;\n" 106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // this rule set is used for values of 3,600 or more. Minutes are always 107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // shown, and always shown with two digits 108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%hr-min-sec:\n" 109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0: :=00=;\n" 110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60/60: <00<>>;\n" 111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 3600/60: <#,##0<:>>>;\n" 112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // the lenient-parse rules allow several different characters to be used 113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // as delimiters between hours, minutes, and seconds 114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%lenient-parse:\n" 115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " & : = . = ' ' = -;\n"; 116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // extra calls to boost coverage numbers 118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat fmt0 = new RuleBasedNumberFormat(RuleBasedNumberFormat.SPELLOUT); 119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat fmt1 = (RuleBasedNumberFormat)fmt0.clone(); 120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat fmt2 = new RuleBasedNumberFormat(RuleBasedNumberFormat.SPELLOUT); 121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!fmt0.equals(fmt0)) { 122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("self equality fails"); 123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!fmt0.equals(fmt1)) { 125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("clone equality fails"); 126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!fmt0.equals(fmt2)) { 128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("duplicate equality fails"); 129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String str = fmt0.toString(); 131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(str); 132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat fmt3 = new RuleBasedNumberFormat(durationInSecondsRules); 134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (fmt0.equals(fmt3)) { 136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("nonequal fails"); 137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!fmt3.equals(fmt3)) { 139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("self equal 2 fails"); 140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin str = fmt3.toString(); 142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(str); 143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[] names = fmt3.getRuleSetNames(); 145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin fmt3.setDefaultRuleSet(null); 148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin fmt3.setDefaultRuleSet("%%foo"); 149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("sdrf %%foo didn't fail"); 150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (Exception e) { 152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("Got the expected exception"); 153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin fmt3.setDefaultRuleSet("%bogus"); 157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("sdrf %bogus didn't fail"); 158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (Exception e) { 160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("Got the expected exception"); 161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin str = fmt3.format(2.3, names[0]); 165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(str); 166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin str = fmt3.format(2.3, "%%foo"); 167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("format double %%foo didn't fail"); 168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (Exception e) { 170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("Got the expected exception"); 171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin str = fmt3.format(123L, names[0]); 175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(str); 176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin str = fmt3.format(123L, "%%foo"); 177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("format double %%foo didn't fail"); 178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (Exception e) { 180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("Got the expected exception"); 181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat fmt4 = new RuleBasedNumberFormat(fracRules, Locale.ENGLISH); 184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat fmt5 = new RuleBasedNumberFormat(fracRules, Locale.ENGLISH); 185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin str = fmt4.toString(); 186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(str); 187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!fmt4.equals(fmt5)) { 188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("duplicate 2 equality failed"); 189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin str = fmt4.format(123L); 191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(str); 192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Number num = fmt4.parse(str); 194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(num.toString()); 195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (Exception e) { 197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("parse caught exception"); 198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin str = fmt4.format(.000123); 201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(str); 202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Number num = fmt4.parse(str); 204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(num.toString()); 205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (Exception e) { 207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("parse caught exception"); 208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin str = fmt4.format(456.000123); 211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(str); 212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Number num = fmt4.parse(str); 214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(num.toString()); 215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (Exception e) { 217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("parse caught exception"); 218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 221f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestUndefinedSpellout() { 223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Locale greek = new Locale("el", "", ""); 224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat[] formatters = { 225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new RuleBasedNumberFormat(greek, RuleBasedNumberFormat.SPELLOUT), 226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new RuleBasedNumberFormat(greek, RuleBasedNumberFormat.ORDINAL), 227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new RuleBasedNumberFormat(greek, RuleBasedNumberFormat.DURATION), 228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[] data = { 231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "0", 232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "1", 233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "15", 234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "20", 235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "23", 236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "73", 237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "88", 238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "100", 239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "106", 240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "127", 241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "200", 242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "579", 243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "1,000", 244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "2,000", 245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "3,004", 246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "4,567", 247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "15,943", 248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "105,000", 249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "2,345,678", 250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "-36", 251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "-36.91215", 252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "234.56789" 253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NumberFormat decFormat = NumberFormat.getInstance(Locale.US); 256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int j = 0; j < formatters.length; ++j) { 257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin android.icu.text.NumberFormat formatter = formatters[j]; 258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("formatter[" + j + "]"); 259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < data.length; ++i) { 260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String result = formatter.format(decFormat.parse(data[i])); 262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("[" + i + "] " + data[i] + " ==> " + result); 263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (Exception e) { 265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("formatter[" + j + "], data[" + i + "] " + data[i] + " threw exception " + e.getMessage()); 266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the English spellout rules 273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 274f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestEnglishSpellout() { 276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.US, 277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat.SPELLOUT); 278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "one" }, 280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15", "fifteen" }, 281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "20", "twenty" }, 282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "23", "twenty-three" }, 283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "73", "seventy-three" }, 284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "88", "eighty-eight" }, 285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "100", "one hundred" }, 286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "106", "one hundred six" }, 287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "127", "one hundred twenty-seven" }, 288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "200", "two hundred" }, 289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "579", "five hundred seventy-nine" }, 290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,000", "one thousand" }, 291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,000", "two thousand" }, 292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3,004", "three thousand four" }, 293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "4,567", "four thousand five hundred sixty-seven" }, 294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15,943", "fifteen thousand nine hundred forty-three" }, 295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,345,678", "two million three hundred forty-five " 296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "thousand six hundred seventy-eight" }, 297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "-36", "minus thirty-six" }, 298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "234.567", "two hundred thirty-four point five six seven" } 299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the English ordinal-abbreviation rules 306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 307f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestOrdinalAbbreviations() { 309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter= new RuleBasedNumberFormat(Locale.US, 310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat.ORDINAL); 311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "1st" }, 313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2", "2nd" }, 314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3", "3rd" }, 315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "4", "4th" }, 316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "7", "7th" }, 317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10", "10th" }, 318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "11", "11th" }, 319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "13", "13th" }, 320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "20", "20th" }, 321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21", "21st" }, 322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "22", "22nd" }, 323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "23", "23rd" }, 324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "24", "24th" }, 325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "33", "33rd" }, 326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "102", "102nd" }, 327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "312", "312th" }, 328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "12,345", "12,345th" } 329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, false); 332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the duration-formatting rules 336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 337f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestDurations() { 339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.US, 340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat.DURATION); 341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3,600", "1:00:00" }, //move me and I fail 343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0", "0 sec." }, 344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "1 sec." }, 345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "24", "24 sec." }, 346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "60", "1:00" }, 347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "73", "1:13" }, 348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "145", "2:25" }, 349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "666", "11:06" }, 350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // { "3,600", "1:00:00" }, 351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3,740", "1:02:20" }, 352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,293", "2:51:33" } 353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the Spanish spellout rules 360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 361f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestSpanishSpellout() { 363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(new Locale("es", "es", 364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ""), RuleBasedNumberFormat.SPELLOUT); 365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "uno" }, 367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "6", "seis" }, 368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "16", "diecis\u00e9is" }, 369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "20", "veinte" }, 370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "24", "veinticuatro" }, 371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "26", "veintis\u00e9is" }, 372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "73", "setenta y tres" }, 373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "88", "ochenta y ocho" }, 374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "100", "cien" }, 375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "106", "ciento seis" }, 376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "127", "ciento veintisiete" }, 377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "200", "doscientos" }, 378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "579", "quinientos setenta y nueve" }, 379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,000", "mil" }, 380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,000", "dos mil" }, 381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3,004", "tres mil cuatro" }, 382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "4,567", "cuatro mil quinientos sesenta y siete" }, 383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15,943", "quince mil novecientos cuarenta y tres" }, 384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,345,678", "dos millones trescientos cuarenta y cinco mil " 385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "seiscientos setenta y ocho"}, 386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "-36", "menos treinta y seis" }, 387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "234.567", "doscientos treinta y cuatro coma cinco seis siete" } 388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the French spellout rules 395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 396f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestFrenchSpellout() { 398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.FRANCE, 399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat.SPELLOUT); 400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "un" }, 402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15", "quinze" }, 403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "20", "vingt" }, 404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21", "vingt-et-un" }, 405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "23", "vingt-trois" }, 406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "62", "soixante-deux" }, 407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "70", "soixante-dix" }, 408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "71", "soixante-et-onze" }, 409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "73", "soixante-treize" }, 410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "80", "quatre-vingts" }, 411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "88", "quatre-vingt-huit" }, 412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "100", "cent" }, 413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "106", "cent six" }, 414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "127", "cent vingt-sept" }, 415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "200", "deux cents" }, 416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "579", "cinq cent soixante-dix-neuf" }, 417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,000", "mille" }, 418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,123", "mille cent vingt-trois" }, 419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,594", "mille cinq cent quatre-vingt-quatorze" }, 420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,000", "deux mille" }, 421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3,004", "trois mille quatre" }, 422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "4,567", "quatre mille cinq cent soixante-sept" }, 423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15,943", "quinze mille neuf cent quarante-trois" }, 424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,345,678", "deux millions trois cent quarante-cinq mille " 425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "six cent soixante-dix-huit" }, 426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "-36", "moins trente-six" }, 427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "234.567", "deux cent trente-quatre virgule cinq six sept" } 428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the Swiss French spellout rules 435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 436f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestSwissFrenchSpellout() { 438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(new Locale("fr", "CH"), 439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat.SPELLOUT); 440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "un" }, 442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15", "quinze" }, 443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "20", "vingt" }, 444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21", "vingt-et-un" }, 445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "23", "vingt-trois" }, 446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "62", "soixante-deux" }, 447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "70", "septante" }, 448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "71", "septante-et-un" }, 449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "73", "septante-trois" }, 450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "80", "huitante" }, 451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "88", "huitante-huit" }, 452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "100", "cent" }, 453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "106", "cent six" }, 454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "127", "cent vingt-sept" }, 455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "200", "deux cents" }, 456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "579", "cinq cent septante-neuf" }, 457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,000", "mille" }, 458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,123", "mille cent vingt-trois" }, 459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,594", "mille cinq cent nonante-quatre" }, 460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,000", "deux mille" }, 461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3,004", "trois mille quatre" }, 462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "4,567", "quatre mille cinq cent soixante-sept" }, 463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15,943", "quinze mille neuf cent quarante-trois" }, 464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,345,678", "deux millions trois cent quarante-cinq mille " 465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "six cent septante-huit" }, 466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "-36", "moins trente-six" }, 467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "234.567", "deux cent trente-quatre virgule cinq six sept" } 468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the Italian spellout rules 475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 476f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 477aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestItalianSpellout() { 478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.ITALIAN, 479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat.SPELLOUT); 480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "uno" }, 482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15", "quindici" }, 483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "20", "venti" }, 484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "23", "venti\u00ADtr\u00E9" }, 485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "73", "settanta\u00ADtr\u00E9" }, 486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "88", "ottant\u00ADotto" }, 487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "100", "cento" }, 488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "106", "cento\u00ADsei" }, 489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "108", "cent\u00ADotto" }, 490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "127", "cento\u00ADventi\u00ADsette" }, 491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "181", "cent\u00ADottant\u00ADuno" }, 492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "200", "due\u00ADcento" }, 493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "579", "cinque\u00ADcento\u00ADsettanta\u00ADnove" }, 494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,000", "mille" }, 495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,000", "due\u00ADmila" }, 496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3,004", "tre\u00ADmila\u00ADquattro" }, 497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "4,567", "quattro\u00ADmila\u00ADcinque\u00ADcento\u00ADsessanta\u00ADsette" }, 498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15,943", "quindici\u00ADmila\u00ADnove\u00ADcento\u00ADquaranta\u00ADtr\u00E9" }, 499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "-36", "meno trenta\u00ADsei" }, 500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "234.567", "due\u00ADcento\u00ADtrenta\u00ADquattro virgola cinque sei sette" } 501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the German spellout rules 508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 509f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestGermanSpellout() { 511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.GERMANY, 512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat.SPELLOUT); 513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "eins" }, 515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15", "f\u00fcnfzehn" }, 516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "20", "zwanzig" }, 517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "23", "drei\u00ADund\u00ADzwanzig" }, 518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "73", "drei\u00ADund\u00ADsiebzig" }, 519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "88", "acht\u00ADund\u00ADachtzig" }, 520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "100", "ein\u00ADhundert" }, 521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "106", "ein\u00ADhundert\u00ADsechs" }, 522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "127", "ein\u00ADhundert\u00ADsieben\u00ADund\u00ADzwanzig" }, 523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "200", "zwei\u00ADhundert" }, 524aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "579", "f\u00fcnf\u00ADhundert\u00ADneun\u00ADund\u00ADsiebzig" }, 525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,000", "ein\u00ADtausend" }, 526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,000", "zwei\u00ADtausend" }, 527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3,004", "drei\u00ADtausend\u00ADvier" }, 528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "4,567", "vier\u00ADtausend\u00ADf\u00fcnf\u00ADhundert\u00ADsieben\u00ADund\u00ADsechzig" }, 529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "15,943", "f\u00fcnfzehn\u00ADtausend\u00ADneun\u00ADhundert\u00ADdrei\u00ADund\u00ADvierzig" }, 530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,345,678", "zwei Millionen drei\u00ADhundert\u00ADf\u00fcnf\u00ADund\u00ADvierzig\u00ADtausend\u00AD" 531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "sechs\u00ADhundert\u00ADacht\u00ADund\u00ADsiebzig" } 532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 538aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the Thai spellout rules 539aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 540f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 541aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestThaiSpellout() { 542aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(new Locale("th", "TH"), 543aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat.SPELLOUT); 544aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 545aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0", "\u0e28\u0e39\u0e19\u0e22\u0e4c" }, 546aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "\u0e2b\u0e19\u0e36\u0e48\u0e07" }, 547aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10", "\u0e2a\u0e34\u0e1a" }, 548aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "11", "\u0e2a\u0e34\u0e1a\u200b\u0e40\u0e2d\u0e47\u0e14" }, 549aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21", "\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e40\u0e2d\u0e47\u0e14" }, 550aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "101", "\u0e2b\u0e19\u0e36\u0e48\u0e07\u200b\u0e23\u0e49\u0e2d\u0e22\u200b\u0e2b\u0e19\u0e36\u0e48\u0e07" }, 551aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1.234", "\u0e2b\u0e19\u0e36\u0e48\u0e07\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e2d\u0e07\u0e2a\u0e32\u0e21\u0e2a\u0e35\u0e48" }, 552aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21.45", "\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e40\u0e2d\u0e47\u0e14\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" }, 553aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "22.45", "\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e2a\u0e2d\u0e07\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" }, 554aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "23.45", "\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e2a\u0e32\u0e21\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" }, 555aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "123.45", "\u0e2b\u0e19\u0e36\u0e48\u0e07\u200b\u0e23\u0e49\u0e2d\u0e22\u200b\u0e22\u0e35\u0e48\u200b\u0e2a\u0e34\u0e1a\u200b\u0e2a\u0e32\u0e21\u200b\u0e08\u0e38\u0e14\u200b\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" }, 556aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "12,345.678", "\u0E2B\u0E19\u0E36\u0E48\u0E07\u200b\u0E2B\u0E21\u0E37\u0E48\u0E19\u200b\u0E2A\u0E2D\u0E07\u200b\u0E1E\u0E31\u0E19\u200b\u0E2A\u0E32\u0E21\u200b\u0E23\u0E49\u0E2D\u0E22\u200b\u0E2A\u0E35\u0E48\u200b\u0E2A\u0E34\u0E1A\u200b\u0E2B\u0E49\u0E32\u200b\u0E08\u0E38\u0E14\u200b\u0E2B\u0E01\u0E40\u0E08\u0E47\u0E14\u0E41\u0E1B\u0E14" }, 557aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 558aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 559aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 560aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 561aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 562aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 563aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the ordinal spellout rules 564aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 565f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 566aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestPluralRules() { 567aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String enRules = "%digits-ordinal:" 568aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "-x: −>>;" 569aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "0: =#,##0=$(ordinal,one{st}two{nd}few{rd}other{th})$;"; 570aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat enFormatter = new RuleBasedNumberFormat(enRules, ULocale.ENGLISH); 571aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] enTestData = { 572aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "1st" }, 573aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2", "2nd" }, 574aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3", "3rd" }, 575aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "4", "4th" }, 576aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "11", "11th" }, 577aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "12", "12th" }, 578aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "13", "13th" }, 579aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "14", "14th" }, 580aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21", "21st" }, 581aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "22", "22nd" }, 582aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "23", "23rd" }, 583aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "24", "24th" }, 584aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 585aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 586aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(enFormatter, enTestData, true); 587aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 588aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // This is trying to model the feminine form, but don't worry about the details too much. 589aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // We're trying to test the plural rules. 590aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String ruRules = "%spellout-numbering:" 591aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "-x: минус >>;" 592aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "x.x: [<< $(cardinal,one{целый}other{целых})$ ]>%%fractions-feminine>;" 593aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "0: ноль;" 594aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1: один;" 595aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "2: два;" 596aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "3: три;" 597aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "4: четыре;" 598aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "5: пять;" 599aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "6: шесть;" 600aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "7: семь;" 601aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "8: восемь;" 602aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "9: девять;" 603aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "10: десять;" 604aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "11: одиннадцать;" 605aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "12: двенадцать;" 606aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "13: тринадцать;" 607aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "14: четырнадцать;" 608aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "15: пятнадцать;" 609aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "16: шестнадцать;" 610aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "17: семнадцать;" 611aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "18: восемнадцать;" 612aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "19: девятнадцать;" 613aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "20: двадцать[ >>];" 614aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "30: тридцать[ >>];" 615aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "40: сорок[ >>];" 616aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "50: пятьдесят[ >>];" 617aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "60: шестьдесят[ >>];" 618aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "70: семьдесят[ >>];" 619aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "80: восемьдесят[ >>];" 620aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "90: девяносто[ >>];" 621aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "100: сто[ >>];" 622aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "200: <<сти[ >>];" 623aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "300: <<ста[ >>];" 624aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "500: <<сот[ >>];" 625aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1000: << $(cardinal,one{тысяча}few{тысячи}other{тысяч})$[ >>];" 626aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1000000: << $(cardinal,one{миллион}few{миллионы}other{миллионов})$[ >>];" 627aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%fractions-feminine:" 628aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "10: <%spellout-numbering< $(cardinal,one{десятая}other{десятых})$;" 629aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "100: <%spellout-numbering< $(cardinal,one{сотая}other{сотых})$;"; 630aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat ruFormatter = new RuleBasedNumberFormat(ruRules, new ULocale("ru")); 631aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] ruTestData = { 632aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "один" }, 633aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "100", "сто" }, 634aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "125", "сто двадцать пять" }, 635aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "399", "триста девяносто девять" }, 636aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,000", "один тысяча" }, 637aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,001", "один тысяча один" }, 638aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,000", "два тысячи" }, 639aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,001", "два тысячи один" }, 640aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,002", "два тысячи два" }, 641aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3,333", "три тысячи триста тридцать три" }, 642aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "5,000", "пять тысяч" }, 643aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "11,000", "одиннадцать тысяч" }, 644aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21,000", "двадцать один тысяча" }, 645aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "22,000", "двадцать два тысячи" }, 646aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "25,001", "двадцать пять тысяч один" }, 647aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.1", "один десятая" }, 648aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.2", "два десятых" }, 649aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.21", "двадцать один сотая" }, 650aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.22", "двадцать два сотых" }, 651aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21.1", "двадцать один целый один десятая" }, 652aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "22.2", "двадцать два целых два десятых" }, 653aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 654aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 655aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(ruFormatter, ruTestData, true); 656aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 657aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Make sure there are no divide by 0 errors. 658aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String result = new RuleBasedNumberFormat(ruRules, new ULocale("ru")).format(21000); 659aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!"двадцать один тысяча".equals(result)) { 660aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("Got " + result + " for 21000"); 661aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 662aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 663aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 664aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 665aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Perform a simple spot check on the parsing going into an infinite loop for alternate rules. 666aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 667f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 668aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestMultiplePluralRules() { 669aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // This is trying to model the feminine form, but don't worry about the details too much. 670aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // We're trying to test the plural rules where there are different prefixes. 671aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String ruRules = "%spellout-cardinal-feminine-genitive:" 672aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "-x: минус >>;" 673aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "x.x: << запятая >>;" 674aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "0: ноля;" 675aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1: одной;" 676aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "2: двух;" 677aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "3: трех;" 678aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "4: четырех;" 679aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "5: пяти;" 680aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "6: шести;" 681aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "7: семи;" 682aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "8: восьми;" 683aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "9: девяти;" 684aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "10: десяти;" 685aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "11: одиннадцати;" 686aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "12: двенадцати;" 687aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "13: тринадцати;" 688aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "14: четырнадцати;" 689aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "15: пятнадцати;" 690aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "16: шестнадцати;" 691aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "17: семнадцати;" 692aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "18: восемнадцати;" 693aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "19: девятнадцати;" 694aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "20: двадцати[ >>];" 695aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "30: тридцати[ >>];" 696aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "40: сорока[ >>];" 697aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "50: пятидесяти[ >>];" 698aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "60: шестидесяти[ >>];" 699aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "70: семидесяти[ >>];" 700aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "80: восемидесяти[ >>];" 701aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "90: девяноста[ >>];" 702aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "100: ста[ >>];" 703aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "200: <<сот[ >>];" 704aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1000: << $(cardinal,one{тысяча}few{тысячи}other{тысяч})$[ >>];" 705aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1000000: =#,##0=;" 706aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%spellout-cardinal-feminine:" 707aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "-x: минус >>;" 708aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "x.x: << запятая >>;" 709aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "0: ноль;" 710aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1: одна;" 711aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "2: две;" 712aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "3: три;" 713aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "4: четыре;" 714aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "5: пять;" 715aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "6: шесть;" 716aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "7: семь;" 717aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "8: восемь;" 718aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "9: девять;" 719aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "10: десять;" 720aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "11: одиннадцать;" 721aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "12: двенадцать;" 722aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "13: тринадцать;" 723aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "14: четырнадцать;" 724aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "15: пятнадцать;" 725aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "16: шестнадцать;" 726aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "17: семнадцать;" 727aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "18: восемнадцать;" 728aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "19: девятнадцать;" 729aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "20: двадцать[ >>];" 730aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "30: тридцать[ >>];" 731aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "40: сорок[ >>];" 732aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "50: пятьдесят[ >>];" 733aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "60: шестьдесят[ >>];" 734aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "70: семьдесят[ >>];" 735aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "80: восемьдесят[ >>];" 736aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "90: девяносто[ >>];" 737aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "100: сто[ >>];" 738aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "200: <<сти[ >>];" 739aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "300: <<ста[ >>];" 740aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "500: <<сот[ >>];" 741aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1000: << $(cardinal,one{тысяча}few{тысячи}other{тысяч})$[ >>];" 742aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1000000: =#,##0=;"; 743aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat ruFormatter = new RuleBasedNumberFormat(ruRules, new ULocale("ru")); 744aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 745aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Number result; 746aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (1000 != (result = ruFormatter.parse(ruFormatter.format(1000))).doubleValue()) { 747aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat did not return the correct value. Got: " + result); 748aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 749aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (1000 != (result = ruFormatter.parse(ruFormatter.format(1000, "%spellout-cardinal-feminine-genitive"))).doubleValue()) { 750aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat did not return the correct value. Got: " + result); 751aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 752aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (1000 != (result = ruFormatter.parse(ruFormatter.format(1000, "%spellout-cardinal-feminine"))).doubleValue()) { 753aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat did not return the correct value. Got: " + result); 754aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 755aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 756aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (ParseException e) { 757aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln(e.toString()); 758aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 759aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 760aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 761f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 762aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestFractionalRuleSet() { 763aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(fracRules, 764aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Locale.ENGLISH); 765aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 766aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 767aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0", "0" }, 768aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "1" }, 769aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10", "10" }, 770aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".1", "1/10" }, 771aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".11", "1/9" }, 772aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".125", "1/8" }, 773aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".1428", "1/7" }, 774aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".1667", "1/6" }, 775aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".2", "1/5" }, 776aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".25", "1/4" }, 777aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".333", "1/3" }, 778aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".5", "1/2" }, 779aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1.1", "1 1/10" }, 780aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2.11", "2 1/9" }, 781aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "3.125", "3 1/8" }, 782aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "4.1428", "4 1/7" }, 783aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "5.1667", "5 1/6" }, 784aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "6.2", "6 1/5" }, 785aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "7.25", "7 1/4" }, 786aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "8.333", "8 1/3" }, 787aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "9.5", "9 1/2" }, 788aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".2222", "2/9" }, 789aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".4444", "4/9" }, 790aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { ".5555", "5/9" }, 791aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1.2856", "1 2/7" } 792aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 793aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, false); // exact values aren't parsable from fractions 794aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 795aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 796f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 797aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestSwedishSpellout() 798aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 799aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Locale locale = new Locale("sv", "", ""); 800aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(locale, 801aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat.SPELLOUT); 802aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 803aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testDataDefault = { 804aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "101", "ett\u00ADhundra\u00ADett" }, 805aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "123", "ett\u00ADhundra\u00ADtjugo\u00ADtre" }, 806aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,001", "et\u00ADtusen ett" }, 807aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,100", "et\u00ADtusen ett\u00ADhundra" }, 808aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,101", "et\u00ADtusen ett\u00ADhundra\u00ADett" }, 809aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,234", "et\u00ADtusen tv\u00e5\u00ADhundra\u00ADtrettio\u00ADfyra" }, 810aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,001", "tio\u00ADtusen ett" }, 811aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "11,000", "elva\u00ADtusen" }, 812aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "12,000", "tolv\u00ADtusen" }, 813aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "20,000", "tjugo\u00ADtusen" }, 814aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21,000", "tjugo\u00ADet\u00ADtusen" }, 815aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21,001", "tjugo\u00ADet\u00ADtusen ett" }, 816aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "200,000", "tv\u00e5\u00ADhundra\u00ADtusen" }, 817aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "201,000", "tv\u00e5\u00ADhundra\u00ADet\u00ADtusen" }, 818aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "200,200", "tv\u00e5\u00ADhundra\u00ADtusen tv\u00e5\u00ADhundra" }, 819aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,002,000", "tv\u00e5 miljoner tv\u00e5\u00ADtusen" }, 820aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "12,345,678", "tolv miljoner tre\u00ADhundra\u00ADfyrtio\u00ADfem\u00ADtusen sex\u00ADhundra\u00ADsjuttio\u00AD\u00e5tta" }, 821aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "123,456.789", "ett\u00ADhundra\u00ADtjugo\u00ADtre\u00ADtusen fyra\u00ADhundra\u00ADfemtio\u00ADsex komma sju \u00e5tta nio" }, 822aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "-12,345.678", "minus tolv\u00ADtusen tre\u00ADhundra\u00ADfyrtio\u00ADfem komma sex sju \u00e5tta" }, 823aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 824aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 825aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("testing default rules"); 826aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testDataDefault, true); 827aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 828aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testDataNeutrum = { 829aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "101", "ett\u00adhundra\u00adett" }, 830aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,001", "et\u00adtusen ett" }, 831aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,101", "et\u00adtusen ett\u00adhundra\u00adett" }, 832aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,001", "tio\u00adtusen ett" }, 833aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "21,001", "tjugo\u00adet\u00adtusen ett" } 834aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 835aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 836aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin formatter.setDefaultRuleSet("%spellout-cardinal-neuter"); 837aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("testing neutrum rules"); 838aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testDataNeutrum, true); 839aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 840aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testDataYear = { 841aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "101", "ett\u00adhundra\u00adett" }, 842aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "900", "nio\u00adhundra" }, 843aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,001", "et\u00adtusen ett" }, 844aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,100", "elva\u00adhundra" }, 845aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,101", "elva\u00adhundra\u00adett" }, 846aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,234", "tolv\u00adhundra\u00adtrettio\u00adfyra" }, 847aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "2,001", "tjugo\u00adhundra\u00adett" }, 848aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,001", "tio\u00adtusen ett" } 849aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 850aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 851aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin formatter.setDefaultRuleSet("%spellout-numbering-year"); 852aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("testing year rules"); 853aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testDataYear, true); 854aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 855aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 856f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 857aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestBigNumbers() { 858aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin BigInteger bigI = new BigInteger("1234567890", 10); 859aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin StringBuffer buf = new StringBuffer(); 860aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat fmt = new RuleBasedNumberFormat(RuleBasedNumberFormat.SPELLOUT); 861aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin fmt.format(bigI, buf, null); 862aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("big int: " + buf.toString()); 863aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 864aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin buf.setLength(0); 865aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin java.math.BigDecimal bigD = new java.math.BigDecimal(bigI); 866aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin fmt.format(bigD, buf, null); 867aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("big dec: " + buf.toString()); 868aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 869aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 870f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 871aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestTrailingSemicolon() { 872aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String thaiRules = 873aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "%default:\n" + 874aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " -x: \u0e25\u0e1a>>;\n" + 875aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " x.x: <<\u0e08\u0e38\u0e14>>>;\n" + 876aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " \u0e28\u0e39\u0e19\u0e22\u0e4c; \u0e2b\u0e19\u0e36\u0e48\u0e07; \u0e2a\u0e2d\u0e07; \u0e2a\u0e32\u0e21;\n" + 877aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " \u0e2a\u0e35\u0e48; \u0e2b\u0e49\u0e32; \u0e2b\u0e01; \u0e40\u0e08\u0e47\u0e14; \u0e41\u0e1b\u0e14;\n" + 878aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " \u0e40\u0e01\u0e49\u0e32; \u0e2a\u0e34\u0e1a; \u0e2a\u0e34\u0e1a\u0e40\u0e2d\u0e47\u0e14;\n" + 879aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " \u0e2a\u0e34\u0e1a\u0e2a\u0e2d\u0e07; \u0e2a\u0e34\u0e1a\u0e2a\u0e32\u0e21;\n" + 880aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " \u0e2a\u0e34\u0e1a\u0e2a\u0e35\u0e48; \u0e2a\u0e34\u0e1a\u0e2b\u0e49\u0e32;\n" + 881aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " \u0e2a\u0e34\u0e1a\u0e2b\u0e01; \u0e2a\u0e34\u0e1a\u0e40\u0e08\u0e47\u0e14;\n" + 882aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " \u0e2a\u0e34\u0e1a\u0e41\u0e1b\u0e14; \u0e2a\u0e34\u0e1a\u0e40\u0e01\u0e49\u0e32;\n" + 883aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 20: \u0e22\u0e35\u0e48\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + 884aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 30: \u0e2a\u0e32\u0e21\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + 885aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 40: \u0e2a\u0e35\u0e48\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + 886aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 50: \u0e2b\u0e49\u0e32\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + 887aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 60: \u0e2b\u0e01\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + 888aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 70: \u0e40\u0e08\u0e47\u0e14\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + 889aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 80: \u0e41\u0e1b\u0e14\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + 890aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 90: \u0e40\u0e01\u0e49\u0e32\u0e2a\u0e34\u0e1a[>%%alt-ones>];\n" + 891aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 100: <<\u0e23\u0e49\u0e2d\u0e22[>>];\n" + 892aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 1000: <<\u0e1e\u0e31\u0e19[>>];\n" + 893aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 10000: <<\u0e2b\u0e21\u0e37\u0e48\u0e19[>>];\n" + 894aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 100000: <<\u0e41\u0e2a\u0e19[>>];\n" + 895aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 1,000,000: <<\u0e25\u0e49\u0e32\u0e19[>>];\n" + 896aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 1,000,000,000: <<\u0e1e\u0e31\u0e19\u0e25\u0e49\u0e32\u0e19[>>];\n" + 897aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 1,000,000,000,000: <<\u0e25\u0e49\u0e32\u0e19\u0e25\u0e49\u0e32\u0e19[>>];\n" + 898aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " 1,000,000,000,000,000: =#,##0=;\n" + 899aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "%%alt-ones:\n" + 900aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " \u0e28\u0e39\u0e19\u0e22\u0e4c;\n" + 901aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " \u0e40\u0e2d\u0e47\u0e14;\n" + 902aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " =%default=;\n ; ;; "; 903aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 904aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(thaiRules, new Locale("th", "TH", "")); 905aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 906aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 907aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0", "\u0e28\u0e39\u0e19\u0e22\u0e4c" }, 908aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1", "\u0e2b\u0e19\u0e36\u0e48\u0e07" }, 909aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "123.45", "\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e23\u0e49\u0e2d\u0e22\u0e22\u0e35\u0e48\u0e2a\u0e34\u0e1a\u0e2a\u0e32\u0e21\u0e08\u0e38\u0e14\u0e2a\u0e35\u0e48\u0e2b\u0e49\u0e32" } 910aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 911aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 912aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 913aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 914aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 915f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 916aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestSmallValues() { 917aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] testData = { 918aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.001", "zero point zero zero one" }, 919aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.0001", "zero point zero zero zero one" }, 920aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.00001", "zero point zero zero zero zero one" }, 921aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.000001", "zero point zero zero zero zero zero one" }, 922aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.0000001", "zero point zero zero zero zero zero zero one" }, 923aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.00000001", "zero point zero zero zero zero zero zero zero one" }, 924aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.000000001", "zero point zero zero zero zero zero zero zero zero one" }, 925aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.0000000001", "zero point zero zero zero zero zero zero zero zero zero one" }, 926aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.00000000001", "zero point zero zero zero zero zero zero zero zero zero zero one" }, 927aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero one" }, 928aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.0000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero one" }, 929aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.00000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero one" }, 930aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.000000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero zero one" }, 931aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,000,000.001", "ten million point zero zero one" }, 932aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,000,000.0001", "ten million point zero zero zero one" }, 933aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,000,000.00001", "ten million point zero zero zero zero one" }, 934aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,000,000.000001", "ten million point zero zero zero zero zero one" }, 935aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,000,000.0000001", "ten million point zero zero zero zero zero zero one" }, 936aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,000,000.00000001", "ten million point zero zero zero zero zero zero zero one" }, 937aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,000,000.000000002", "ten million point zero zero zero zero zero zero zero zero two" }, 938aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "10,000,000", "ten million" }, 939aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,234,567,890.0987654", "one billion two hundred thirty-four million five hundred sixty-seven thousand eight hundred ninety point zero nine eight seven six five four" }, 940aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "123,456,789.9876543", "one hundred twenty-three million four hundred fifty-six thousand seven hundred eighty-nine point nine eight seven six five four three" }, 941aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "12,345,678.87654321", "twelve million three hundred forty-five thousand six hundred seventy-eight point eight seven six five four three two one" }, 942aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,234,567.7654321", "one million two hundred thirty-four thousand five hundred sixty-seven point seven six five four three two one" }, 943aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "123,456.654321", "one hundred twenty-three thousand four hundred fifty-six point six five four three two one" }, 944aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "12,345.54321", "twelve thousand three hundred forty-five point five four three two one" }, 945aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "1,234.4321", "one thousand two hundred thirty-four point four three two one" }, 946aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "123.321", "one hundred twenty-three point three two one" }, 947aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.0000000011754944", "zero point zero zero zero zero zero zero zero zero one one seven five four nine four four" }, 948aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { "0.000001175494351", "zero point zero zero zero zero zero one one seven five four nine four three five one" }, 949aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 950aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 951aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(Locale.US, RuleBasedNumberFormat.SPELLOUT); 952aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(formatter, testData, true); 953aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 954aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 955f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 956aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestRuleSetDisplayName() { 957495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert /* 958aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Spellout rules for U.K. English. 959495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert * This was borrowed from the rule sets for TestRuleSetDisplayName() 960aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 961aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin final String ukEnglish = 962aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "%simplified:\n" 963aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " -x: minus >>;\n" 964aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " x.x: << point >>;\n" 965aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " zero; one; two; three; four; five; six; seven; eight; nine;\n" 966aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n" 967aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " seventeen; eighteen; nineteen;\n" 968aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 20: twenty[->>];\n" 969aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 30: thirty[->>];\n" 970aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 40: forty[->>];\n" 971aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 50: fifty[->>];\n" 972aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60: sixty[->>];\n" 973aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 70: seventy[->>];\n" 974aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 80: eighty[->>];\n" 975aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 90: ninety[->>];\n" 976aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: << hundred[ >>];\n" 977aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000: << thousand[ >>];\n" 978aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: << million[ >>];\n" 979aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000: << billion[ >>];\n" 980aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000,000: =#,##0=;\n" 981aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%alt-teens:\n" 982aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " =%simplified=;\n" 983aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000>: <%%alt-hundreds<[ >>];\n" 984aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 10,000: =%simplified=;\n" 985aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: << million[ >%simplified>];\n" 986aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000: << billion[ >%simplified>];\n" 987aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000,000: =#,##0=;\n" 988aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%alt-hundreds:\n" 989aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0: SHOULD NEVER GET HERE!;\n" 990aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 10: <%simplified< thousand;\n" 991aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 11: =%simplified= hundred>%%empty>;\n" 992aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%empty:\n" 993aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0:;" 994aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%ordinal:\n" 995aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " zeroth; first; second; third; fourth; fifth; sixth; seventh;\n" 996aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " eighth; ninth;\n" 997aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " tenth; eleventh; twelfth; thirteenth; fourteenth;\n" 998aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " fifteenth; sixteenth; seventeenth; eighteenth;\n" 999aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " nineteenth;\n" 1000aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " twentieth; twenty->>;\n" 1001aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 30: thirtieth; thirty->>;\n" 1002aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 40: fortieth; forty->>;\n" 1003aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 50: fiftieth; fifty->>;\n" 1004aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60: sixtieth; sixty->>;\n" 1005aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 70: seventieth; seventy->>;\n" 1006aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 80: eightieth; eighty->>;\n" 1007aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 90: ninetieth; ninety->>;\n" 1008aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: <%simplified< hundredth; <%simplified< hundred >>;\n" 1009aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000: <%simplified< thousandth; <%simplified< thousand >>;\n" 1010aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: <%simplified< millionth; <%simplified< million >>;\n" 1011aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000: <%simplified< billionth;\n" 1012aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " <%simplified< billion >>;\n" 1013aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000,000: =#,##0=;" 1014aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%default:\n" 1015aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " -x: minus >>;\n" 1016aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " x.x: << point >>;\n" 1017aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " =%simplified=;\n" 1018aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: << hundred[ >%%and>];\n" 1019aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000: << thousand[ >%%and>];\n" 1020aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100,000>>: << thousand[>%%commas>];\n" 1021aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: << million[>%%commas>];\n" 1022aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000: << billion[>%%commas>];\n" 1023aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000,000: =#,##0=;\n" 1024aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%and:\n" 1025aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " and =%default=;\n" 1026aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: =%default=;\n" 1027aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%commas:\n" 1028aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " ' and =%default=;\n" 1029aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: , =%default=;\n" 1030aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000: , <%default< thousand, >%default>;\n" 1031aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: , =%default=;" 1032aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%lenient-parse:\n" 1033aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " & ' ' , ',' ;\n"; 1034aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ULocale.setDefault(ULocale.US); 1035aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] localizations = new String[][] { 1036aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* public rule sets*/ 1037aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"%simplified", "%default", "%ordinal"}, 1038aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* display names in "en_US" locale*/ 1039aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"en_US", "Simplified", "Default", "Ordinal"}, 1040aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* display names in "zh_Hans" locale*/ 1041aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"zh_Hans", "\u7B80\u5316", "\u7F3A\u7701", "\u5E8F\u5217"}, 1042aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* display names in a fake locale*/ 1043aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"foo_Bar_BAZ", "Simplified", "Default", "Ordinal"} 1044aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1045aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1046aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin //Construct RuleBasedNumberFormat by rule sets and localizations list 1047aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat formatter 1048aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin = new RuleBasedNumberFormat(ukEnglish, localizations, ULocale.US); 1049aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat f2= new RuleBasedNumberFormat(ukEnglish, localizations); 1050aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin assertTrue("Check the two formatters' equality", formatter.equals(f2)); 1051aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1052aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin //get displayName by name 1053aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[] ruleSetNames = formatter.getRuleSetNames(); 1054aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i=0; i<ruleSetNames.length; i++) { 1055aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("Rule set name: " + ruleSetNames[i]); 1056aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String RSName_defLoc = formatter.getRuleSetDisplayName(ruleSetNames[i]); 1057aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin assertEquals("Display name in default locale", localizations[1][i+1], RSName_defLoc); 1058aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String RSName_loc = formatter.getRuleSetDisplayName(ruleSetNames[i], ULocale.CHINA); 1059aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin assertEquals("Display name in Chinese", localizations[2][i+1], RSName_loc); 1060aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1061aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1062aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // getDefaultRuleSetName 1063aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String defaultRS = formatter.getDefaultRuleSetName(); 1064aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin //you know that the default rule set is %simplified according to rule sets string ukEnglish 1065aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin assertEquals("getDefaultRuleSetName", "%simplified", defaultRS); 1066aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1067aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin //get locales of localizations 1068aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ULocale[] locales = formatter.getRuleSetDisplayNameLocales(); 1069aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i=0; i<locales.length; i++) { 1070aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(locales[i].getName()); 1071aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1072aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1073aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin //get displayNames 1074aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[] RSNames_defLoc = formatter.getRuleSetDisplayNames(); 1075aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i=0; i<RSNames_defLoc.length; i++) { 1076aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin assertEquals("getRuleSetDisplayNames in default locale", localizations[1][i+1], RSNames_defLoc[i]); 1077aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1078aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1079aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[] RSNames_loc = formatter.getRuleSetDisplayNames(ULocale.UK); 1080aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i=0; i<RSNames_loc.length; i++) { 1081aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin assertEquals("getRuleSetDisplayNames in English", localizations[1][i+1], RSNames_loc[i]); 1082aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1083aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1084aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RSNames_loc = formatter.getRuleSetDisplayNames(ULocale.CHINA); 1085aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i=0; i<RSNames_loc.length; i++) { 1086aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin assertEquals("getRuleSetDisplayNames in Chinese", localizations[2][i+1], RSNames_loc[i]); 1087aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1088aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1089aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RSNames_loc = formatter.getRuleSetDisplayNames(new ULocale("foo_Bar_BAZ")); 1090aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i=0; i<RSNames_loc.length; i++) { 1091aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin assertEquals("getRuleSetDisplayNames in fake locale", localizations[3][i+1], RSNames_loc[i]); 1092aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1093aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1094aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1095f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1096aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestAllLocales() { 1097aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin StringBuilder errors = new StringBuilder(); 1098aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[] names = { 1099aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " (spellout) ", 1100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin " (ordinal) " 1101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin //" (duration) " // English only 1102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin double[] numbers = {45.678, 1, 2, 10, 11, 100, 110, 200, 1000, 1111, -1111}; 1104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int count = numbers.length; 1105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Random r = (count <= numbers.length ? null : createRandom()); 1106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (ULocale loc : NumberFormat.getAvailableULocales()) { 1108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int j = 0; j < names.length; ++j) { 1109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat fmt = new RuleBasedNumberFormat(loc, j+1); 1110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!loc.equals(fmt.getLocale(ULocale.ACTUAL_LOCALE))) { 1111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Skip the redundancy 1112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin break; 1113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int c = 0; c < count; c++) { 1116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin double n; 1117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (c < numbers.length) { 1118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin n = numbers[c]; 1119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 1120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin n = (r.nextInt(10000) - 3000) / 16d; 1121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String s = fmt.format(n); 1124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (isVerbose()) { 1125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(loc.getName() + names[j] + "success format: " + n + " -> " + s); 1126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 1129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // RBNF parse is extremely slow when lenient option is enabled. 1130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // non-lenient parse 1131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin fmt.setLenientParseMode(false); 1132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Number num = fmt.parse(s); 1133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (isVerbose()) { 1134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(loc.getName() + names[j] + "success parse: " + s + " -> " + num); 1135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (j != 0) { 1137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // TODO: Fix the ordinal rules. 1138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin continue; 1139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (n != num.doubleValue()) { 1141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errors.append("\n" + loc + names[j] + "got " + num + " expected " + n); 1142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch (ParseException pe) { 1144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String msg = loc.getName() + names[j] + "ERROR:" + pe.getMessage(); 1145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln(msg); 1146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errors.append("\n" + msg); 1147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (errors.length() > 0) { 1152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln(errors.toString()); 1153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin void doTest(RuleBasedNumberFormat formatter, String[][] testData, 1157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin boolean testParsing) { 1158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // NumberFormat decFmt = NumberFormat.getInstance(Locale.US); 1159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NumberFormat decFmt = new DecimalFormat("#,###.################"); 1160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 1161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < testData.length; i++) { 1162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String number = testData[i][0]; 1163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String expectedWords = testData[i][1]; 1164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (isVerbose()) { 1165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin logln("test[" + i + "] number: " + number + " target: " + expectedWords); 1166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Number num = decFmt.parse(number); 1168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String actualWords = formatter.format(num); 1169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!actualWords.equals(expectedWords)) { 1171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("Spot check format failed: for " + number + ", expected\n " 1172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + expectedWords + ", but got\n " + 1173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin actualWords); 1174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin else if (testParsing) { 1176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String actualNumber = decFmt.format(formatter 1177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin .parse(actualWords)); 1178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!actualNumber.equals(number)) { 1180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("Spot check parse failed: for " + actualWords + 1181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ", expected " + number + ", but got " + 1182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin actualNumber); 1183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin catch (Throwable e) { 1188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin e.printStackTrace(); 1189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("Test failed with exception: " + e.toString()); 1190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* Tests the method 1194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * public boolean equals(Object that) 1195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 1196f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestEquals(){ 1198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Tests when "if (!(that instanceof RuleBasedNumberFormat))" is true 1199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat("dummy"); 1200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (rbnf.equals("dummy") || 1201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.equals(new Character('a')) || 1202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.equals(new Object()) || 1203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.equals(-1) || 1204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.equals(0) || 1205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.equals(1) || 1206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.equals(-1.0) || 1207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.equals(0.0) || 1208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.equals(1.0)) 1209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 1210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.equals(Object that) was suppose to " + 1211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "be false for an invalid object."); 1212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Tests when 1215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // "if (!locale.equals(that2.locale) || lenientParse != that2.lenientParse)" 1216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // is true 1217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf1 = new RuleBasedNumberFormat("dummy", new Locale("en")); 1218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf2 = new RuleBasedNumberFormat("dummy", new Locale("jp")); 1219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf3 = new RuleBasedNumberFormat("dummy", new Locale("sp")); 1220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf4 = new RuleBasedNumberFormat("dummy", new Locale("fr")); 1221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(rbnf1.equals(rbnf2) || rbnf1.equals(rbnf3) || 1223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf1.equals(rbnf4) || rbnf2.equals(rbnf3) || 1224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf2.equals(rbnf4) || rbnf3.equals(rbnf4)){ 1225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.equals(Object that) was suppose to " + 1226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "be false for an invalid object."); 1227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(!rbnf1.equals(rbnf1)){ 1230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " + 1231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "be false for an invalid object."); 1232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(!rbnf2.equals(rbnf2)){ 1235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " + 1236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "be false for an invalid object."); 1237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(!rbnf3.equals(rbnf3)){ 1240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " + 1241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "be false for an invalid object."); 1242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(!rbnf4.equals(rbnf4)){ 1245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " + 1246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "be false for an invalid object."); 1247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf5 = new RuleBasedNumberFormat("dummy", new Locale("en")); 1250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf6 = new RuleBasedNumberFormat("dummy", new Locale("en")); 1251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(!rbnf5.equals(rbnf6)){ 1253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.equals(Object that) was not suppose to " + 1254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "be false for an invalid object."); 1255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf6.setLenientParseMode(true); 1257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(rbnf5.equals(rbnf6)){ 1259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.equals(Object that) was suppose to " + 1260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "be false for an invalid object."); 1261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Tests when "if (!ruleSets[i].equals(that2.ruleSets[i]))" is true 1264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf7 = new RuleBasedNumberFormat("not_dummy", new Locale("en")); 1265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(rbnf5.equals(rbnf7)){ 1266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.equals(Object that) was suppose to " + 1267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "be false for an invalid object."); 1268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* Tests the method 1272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * public ULocale[] getRuleSetDisplayNameLocales() 1273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 1274f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestGetRuleDisplayNameLocales(){ 1276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Tests when "if (ruleSetDisplayNames != null" is false 1277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat("dummy"); 1278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.getRuleSetDisplayNameLocales(); 1279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if(rbnf.getRuleSetDisplayNameLocales() != null){ 1280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.getRuleDisplayNameLocales() was suppose to " + 1281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "return null."); 1282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* Tests the method 1286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * private String[] getNameListForLocale(ULocale loc) 1287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * public String[] getRuleSetDisplayNames(ULocale loc) 1288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 1289f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestGetNameListForLocale(){ 1291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Tests when "if (names != null)" is false and 1292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // "if (loc != null && ruleSetDisplayNames != null)" is false 1293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat("dummy"); 1294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.getRuleSetDisplayNames(null); 1295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try{ 1296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.getRuleSetDisplayNames(null); 1297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch(Exception e){ 1298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.getRuleSetDisplayNames(ULocale loc) " + 1299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "was not suppose to have an exception."); 1300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* Tests the method 1304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * public String getRuleSetDisplayName(String ruleSetName, ULocale loc) 1305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 1306f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestGetRulesSetDisplayName(){ 1308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat("dummy"); 1309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin //rbnf.getRuleSetDisplayName("dummy", new ULocale("en_US")); 1310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Tests when "if (names != null) " is true 1312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Tests when the method throws an exception 1314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try{ 1315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.getRuleSetDisplayName("", new ULocale("en_US")); 1316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.getRuleSetDisplayName(String ruleSetName, ULocale loc) " + 1317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "was suppose to have an exception."); 1318495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert } catch(Exception ignored){} 1319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try{ 1321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.getRuleSetDisplayName("dummy", new ULocale("en_US")); 1322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RuleBasedNumberFormat.getRuleSetDisplayName(String ruleSetName, ULocale loc) " + 1323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "was suppose to have an exception."); 1324495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert } catch(Exception ignored){} 1325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* Test the method 1328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * public void process(StringBuffer buf, NFRuleSet ruleSet) 1329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 1330f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestChineseProcess(){ 1332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String ruleWithChinese = 1333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "%simplified:\n" 1334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " -x: minus >>;\n" 1335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " x.x: << point >>;\n" 1336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " zero; one; two; three; four; five; six; seven; eight; nine;\n" 1337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n" 1338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " seventeen; eighteen; nineteen;\n" 1339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 20: twenty[->>];\n" 1340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 30: thirty[->>];\n" 1341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 40: forty[->>];\n" 1342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 50: fifty[->>];\n" 1343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60: sixty[->>];\n" 1344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 70: seventy[->>];\n" 1345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 80: eighty[->>];\n" 1346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 90: ninety[->>];\n" 1347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: << hundred[ >>];\n" 1348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000: << thousand[ >>];\n" 1349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: << million[ >>];\n" 1350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000: << billion[ >>];\n" 1351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000,000: =#,##0=;\n" 1352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%alt-teens:\n" 1353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " =%simplified=;\n" 1354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000>: <%%alt-hundreds<[ >>];\n" 1355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 10,000: =%simplified=;\n" 1356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: << million[ >%simplified>];\n" 1357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000: << billion[ >%simplified>];\n" 1358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000,000: =#,##0=;\n" 1359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%alt-hundreds:\n" 1360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0: SHOULD NEVER GET HERE!;\n" 1361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 10: <%simplified< thousand;\n" 1362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 11: =%simplified= hundred>%%empty>;\n" 1363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%empty:\n" 1364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0:;" 1365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%accounting:\n" 1366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c;\n" 1367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " \u842c; \u842c;\n" 1368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " \u842c; \u842c; \u842c; \u842c; \u842c;\n" 1369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " \u842c; \u842c; \u842c; \u842c;\n" 1370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " \u842c;\n" 1371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " twentieth; \u96f6|>>;\n" 1372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 30: \u96f6; \u96f6|>>;\n" 1373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 40: \u96f6; \u96f6|>>;\n" 1374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 50: \u96f6; \u96f6|>>;\n" 1375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60: \u96f6; \u96f6|>>;\n" 1376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 70: \u96f6; \u96f6|>>;\n" 1377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 80: \u96f6; \u96f6|>>;\n" 1378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 90: \u96f6; \u96f6|>>;\n" 1379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: <%simplified< \u96f6; <%simplified< \u96f6 >>;\n" 1380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000: <%simplified< \u96f6; <%simplified< \u96f6 >>;\n" 1381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: <%simplified< \u96f6; <%simplified< \u96f6 >>;\n" 1382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000: <%simplified< \u96f6;\n" 1383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " <%simplified< \u96f6 >>;\n" 1384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000,000: =#,##0=;" 1385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%default:\n" 1386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " -x: minus >>;\n" 1387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " x.x: << point >>;\n" 1388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " =%simplified=;\n" 1389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: << hundred[ >%%and>];\n" 1390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000: << thousand[ >%%and>];\n" 1391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100,000>>: << thousand[>%%commas>];\n" 1392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: << million[>%%commas>];\n" 1393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000: << billion[>%%commas>];\n" 1394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000,000: =#,##0=;\n" 1395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%and:\n" 1396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " and =%default=;\n" 1397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: =%default=;\n" 1398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%commas:\n" 1399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " ' and =%default=;\n" 1400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: , =%default=;\n" 1401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000: , <%default< thousand, >%default>;\n" 1402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: , =%default=;" 1403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%traditional:\n" 1404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " -x: \u3007| >>;\n" 1405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " x.x: << \u9ede >>;\n" 1406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c;\n" 1407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " \u842c; \u842c; \u842c; \u842c; \u842c; \u842c; \u842c;\n" 1408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " \u842c; \u842c; \u842c;\n" 1409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 20: \u842c[->>];\n" 1410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 30: \u842c[->>];\n" 1411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 40: \u842c[->>];\n" 1412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 50: \u842c[->>];\n" 1413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60: \u842c[->>];\n" 1414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 70: \u842c[->>];\n" 1415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 80: \u842c[->>];\n" 1416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 90: \u842c[->>];\n" 1417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 100: << \u842c[ >>];\n" 1418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1000: << \u842c[ >>];\n" 1419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000: << \u842c[ >>];\n" 1420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000: << \u842c[ >>];\n" 1421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 1,000,000,000,000,000: =#,##0=;\n" 1422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%time:\n" 1423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " =0= sec.;\n" 1424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60: =%%min-sec=;\n" 1425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 3600: =%%hr-min-sec=;\n" 1426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%min-sec:\n" 1427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0: *=00=;\n" 1428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60/60: <0<>>;\n" 1429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%hr-min-sec:\n" 1430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 0: *=00=;\n" 1431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 60/60: <00<>>;\n" 1432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + " 3600/60: <#,##0<:>>>;\n" 1433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "%%post-process:android.icu.text.RBNFChinesePostProcessor\n"; 1434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(ruleWithChinese, ULocale.CHINESE); 1436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[] ruleNames = rbnf.getRuleSetNames(); 1437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try{ 1438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Test with "null" rules 1439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.format(0.0, null); 1440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("This was suppose to return an exception for a null format"); 1441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch(Exception e){} 1442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for(int i=0; i<ruleNames.length; i++){ 1443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try{ 1444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.format(-123450.6789,ruleNames[i]); 1445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch(Exception e){ 1446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("RBNFChinesePostProcessor was not suppose to return an exception " + 1447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "when being formatted with parameters 0.0 and " + ruleNames[i]); 1448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1452f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestSetDecimalFormatSymbols() { 1454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(Locale.ENGLISH, RuleBasedNumberFormat.ORDINAL); 1455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.ENGLISH); 1457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin double number = 1001; 1459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[] expected = { "1,001st", "1&001st" }; 1461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String result = rbnf.format(number); 1463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!result.equals(expected[0])) { 1464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("Format Error - Got: " + result + " Expected: " + expected[0]); 1465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* Set new symbol for testing */ 1468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin dfs.setGroupingSeparator('&'); 1469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.setDecimalFormatSymbols(dfs); 1470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result = rbnf.format(number); 1472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!result.equals(expected[1])) { 1473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("Format Error - Got: " + result + " Expected: " + expected[1]); 1474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1476aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1477f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestContext() { 1479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin class TextContextItem { 1480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String locale; 1481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public int format; 1482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public DisplayContext context; 1483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public double value; 1484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String expectedResult; 1485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Simple constructor 1486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public TextContextItem(String loc, int fmt, DisplayContext ctxt, double val, String expRes) { 1487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin locale = loc; 1488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin format = fmt; 1489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin context = ctxt; 1490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value = val; 1491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin expectedResult = expRes; 1492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin final TextContextItem[] items = { 1495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new TextContextItem( "sv", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, 123.45, "ett\u00ADhundra\u00ADtjugo\u00ADtre komma fyra fem" ), 1496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new TextContextItem( "sv", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, 123.45, "Ett\u00ADhundra\u00ADtjugo\u00ADtre komma fyra fem" ), 1497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new TextContextItem( "sv", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU, 123.45, "ett\u00ADhundra\u00ADtjugo\u00ADtre komma fyra fem" ), 1498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new TextContextItem( "sv", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_STANDALONE, 123.45, "ett\u00ADhundra\u00ADtjugo\u00ADtre komma fyra fem" ), 1499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new TextContextItem( "en", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, 123.45, "one hundred twenty-three point four five" ), 1500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new TextContextItem( "en", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, 123.45, "One hundred twenty-three point four five" ), 1501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new TextContextItem( "en", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU, 123.45, "One hundred twenty-three point four five" ), 1502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new TextContextItem( "en", RuleBasedNumberFormat.SPELLOUT, DisplayContext.CAPITALIZATION_FOR_STANDALONE, 123.45, "One hundred twenty-three point four five" ), 1503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (TextContextItem item: items) { 1505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ULocale locale = new ULocale(item.locale); 1506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(locale, item.format); 1507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin rbnf.setContext(item.context); 1508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String result = rbnf.format(item.value, rbnf.getDefaultRuleSetName()); 1509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!result.equals(item.expectedResult)) { 1510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("Error for locale " + item.locale + ", context " + item.context + ", expected " + item.expectedResult + ", got " + result); 1511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat rbnfClone = (RuleBasedNumberFormat)rbnf.clone(); 1513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!rbnfClone.equals(rbnf)) { 1514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("Error for locale " + item.locale + ", context " + item.context + ", rbnf.clone() != rbnf"); 1515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 1516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result = rbnfClone.format(item.value, rbnfClone.getDefaultRuleSetName()); 1517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!result.equals(item.expectedResult)) { 1518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin errln("Error with clone for locale " + item.locale + ", context " + item.context + ", expected " + item.expectedResult + ", got " + result); 1519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1524f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestInfinityNaN() { 1526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String enRules = "%default:" 1527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "-x: minus >>;" 1528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "Inf: infinite;" 1529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "NaN: not a number;" 1530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "0: =#,##0=;"; 1531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat enFormatter = new RuleBasedNumberFormat(enRules, ULocale.ENGLISH); 1532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] enTestData = { 1533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1", "1"}, 1534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"\u221E", "infinite"}, 1535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"-\u221E", "minus infinite"}, 1536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"NaN", "not a number"}, 1537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1538aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1539aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1540aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(enFormatter, enTestData, true); 1541aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1542aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // Test the default behavior when the rules are undefined. 1543aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enRules = "%default:" 1544aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "-x: ->>;" 1545aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "0: =#,##0=;"; 1546aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enFormatter = new RuleBasedNumberFormat(enRules, ULocale.ENGLISH); 1547aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] enDefaultTestData = { 1548aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1", "1"}, 1549aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"\u221E", "∞"}, 1550aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"-\u221E", "-∞"}, 1551aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"NaN", "NaN"}, 1552aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1553aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1554aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1555aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(enFormatter, enDefaultTestData, true); 1556aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1557aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1558f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1559aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestVariableDecimalPoint() { 1560aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String enRules = "%spellout-numbering:" 1561aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "-x: minus >>;" 1562aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "x.x: << point >>;" 1563aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "x,x: << comma >>;" 1564aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "0.x: xpoint >>;" 1565aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "0,x: xcomma >>;" 1566aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "0: zero;" 1567aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "1: one;" 1568aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "2: two;" 1569aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "3: three;" 1570aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "4: four;" 1571aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "5: five;" 1572aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "6: six;" 1573aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "7: seven;" 1574aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "8: eight;" 1575aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin + "9: nine;"; 1576aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat enFormatter = new RuleBasedNumberFormat(enRules, ULocale.ENGLISH); 1577aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] enTestPointData = { 1578aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.1", "one point one"}, 1579aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.23", "one point two three"}, 1580aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.4", "xpoint four"}, 1581aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1582aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(enFormatter, enTestPointData, true); 1583aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(ULocale.ENGLISH); 1584aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin decimalFormatSymbols.setDecimalSeparator(','); 1585aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enFormatter.setDecimalFormatSymbols(decimalFormatSymbols); 1586aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] enTestCommaData = { 1587aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.1", "one comma one"}, 1588aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.23", "one comma two three"}, 1589aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.4", "xcomma four"}, 1590aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1591aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(enFormatter, enTestCommaData, true); 1592aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1593aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1594f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1595aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void TestRounding() { 1596aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin RuleBasedNumberFormat enFormatter = new RuleBasedNumberFormat(ULocale.ENGLISH, RuleBasedNumberFormat.SPELLOUT); 1597aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] enTestFullData = { 1598aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0", "zero"}, 1599aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.4", "zero point four"}, 1600aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.49", "zero point four nine"}, 1601aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.5", "zero point five"}, 1602aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.51", "zero point five one"}, 1603aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.99", "zero point nine nine"}, 1604aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1", "one"}, 1605aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.01", "one point zero one"}, 1606aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.49", "one point four nine"}, 1607aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.5", "one point five"}, 1608aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.51", "one point five one"}, 1609aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"450359962737049.6", "four hundred fifty trillion three hundred fifty-nine billion nine hundred sixty-two million seven hundred thirty-seven thousand forty-nine point six"}, // 2^52 / 10 1610aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"450359962737049.7", "four hundred fifty trillion three hundred fifty-nine billion nine hundred sixty-two million seven hundred thirty-seven thousand forty-nine point seven"}, // 2^52 + 1 / 10 1611aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1612aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(enFormatter, enTestFullData, false); 1613aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1614aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enFormatter.setMaximumFractionDigits(0); 1615aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enFormatter.setRoundingMode(BigDecimal.ROUND_HALF_EVEN); 1616aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] enTestIntegerData = { 1617aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0", "zero"}, 1618aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.4", "zero"}, 1619aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.49", "zero"}, 1620aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.5", "zero"}, 1621aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.51", "one"}, 1622aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.99", "one"}, 1623aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1", "one"}, 1624aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.01", "one"}, 1625aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.49", "one"}, 1626aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.5", "two"}, 1627aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"1.51", "two"}, 1628aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1629aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(enFormatter, enTestIntegerData, false); 1630aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1631aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enFormatter.setMaximumFractionDigits(1); 1632aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enFormatter.setRoundingMode(BigDecimal.ROUND_HALF_EVEN); 1633aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] enTestTwoDigitsData = { 1634aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0", "zero"}, 1635aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.04", "zero"}, 1636aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.049", "zero"}, 1637aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.05", "zero"}, 1638aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.051", "zero point one"}, 1639aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"0.099", "zero point one"}, 1640aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"10.11", "ten point one"}, 1641aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"10.149", "ten point one"}, 1642aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"10.15", "ten point two"}, 1643aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"10.151", "ten point two"}, 1644aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1645aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(enFormatter, enTestTwoDigitsData, false); 1646aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 1647aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enFormatter.setMaximumFractionDigits(3); 1648aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enFormatter.setRoundingMode(BigDecimal.ROUND_DOWN); 1649aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String[][] enTestThreeDigitsDownData = { 1650aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {"4.3", "four point three"}, // Not 4.299! 1651aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 1652aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin doTest(enFormatter, enTestThreeDigitsDownData, false); 1653aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 1654f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert 1655f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert @Test 1656f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert public void testLargeNumbers() { 1657f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(ULocale.US, RuleBasedNumberFormat.SPELLOUT); 1658f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert 1659f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert String[][] enTestFullData = { 1660495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"-9007199254740991", "minus nine quadrillion seven trillion one hundred ninety-nine billion two hundred fifty-four million seven hundred forty thousand nine hundred ninety-one"}, // Maximum precision in both a double and a long 1661495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"9007199254740991", "nine quadrillion seven trillion one hundred ninety-nine billion two hundred fifty-four million seven hundred forty thousand nine hundred ninety-one"}, // Maximum precision in both a double and a long 1662495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"-9007199254740992", "minus nine quadrillion seven trillion one hundred ninety-nine billion two hundred fifty-four million seven hundred forty thousand nine hundred ninety-two"}, // Only precisely contained in a long 1663495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"9007199254740992", "nine quadrillion seven trillion one hundred ninety-nine billion two hundred fifty-four million seven hundred forty thousand nine hundred ninety-two"}, // Only precisely contained in a long 1664f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"9999999999999998", "nine quadrillion nine hundred ninety-nine trillion nine hundred ninety-nine billion nine hundred ninety-nine million nine hundred ninety-nine thousand nine hundred ninety-eight"}, 1665f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"9999999999999999", "nine quadrillion nine hundred ninety-nine trillion nine hundred ninety-nine billion nine hundred ninety-nine million nine hundred ninety-nine thousand nine hundred ninety-nine"}, 1666f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"999999999999999999", "nine hundred ninety-nine quadrillion nine hundred ninety-nine trillion nine hundred ninety-nine billion nine hundred ninety-nine million nine hundred ninety-nine thousand nine hundred ninety-nine"}, 1667f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"1000000000000000000", "1,000,000,000,000,000,000"}, // The rules don't go to 1 quintillion yet 1668f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"-9223372036854775809", "-9,223,372,036,854,775,809"}, // We've gone beyond 64-bit precision 1669f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"-9223372036854775808", "-9,223,372,036,854,775,808"}, // We've gone beyond +64-bit precision 1670f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"-9223372036854775807", "minus 9,223,372,036,854,775,807"}, // Minimum 64-bit precision 1671f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"-9223372036854775806", "minus 9,223,372,036,854,775,806"}, // Minimum 64-bit precision + 1 1672f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"9223372036854774111", "9,223,372,036,854,774,111"}, // Below 64-bit precision 1673f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"9223372036854774999", "9,223,372,036,854,774,999"}, // Below 64-bit precision 1674f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"9223372036854775000", "9,223,372,036,854,775,000"}, // Below 64-bit precision 1675f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"9223372036854775806", "9,223,372,036,854,775,806"}, // Maximum 64-bit precision - 1 1676f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert {"9223372036854775807", "9,223,372,036,854,775,807"}, // Maximum 64-bit precision 1677495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"9223372036854775808", "9,223,372,036,854,775,808"}, // We've gone beyond 64-bit precision. This can only be represented with BigDecimal. 1678495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert }; 1679495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert doTest(rbnf, enTestFullData, false); 1680495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert } 1681495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert 1682495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert @Test 1683495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert public void testCompactDecimalFormatStyle() { 1684495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert // This is not a common use case, but we're testing it anyway. 1685495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert final String numberPattern = "=###0.#####=;" 1686495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert + "1000: <###0.00< K;" 1687495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert + "1000000: <###0.00< M;" 1688495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert + "1000000000: <###0.00< B;" 1689495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert + "1000000000000: <###0.00< T;" 1690495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert + "1000000000000000: <###0.00< Q;"; 1691495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(numberPattern, ULocale.US); 1692495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert 1693495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert String[][] enTestFullData = { 1694495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"1000", "1.00 K"}, 1695495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"1234", "1.23 K"}, 1696495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"999994", "999.99 K"}, 1697495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"999995", "1000.00 K"}, 1698495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"1000000", "1.00 M"}, 1699495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"1200000", "1.20 M"}, 1700495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"1200000000", "1.20 B"}, 1701495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"1200000000000", "1.20 T"}, 1702495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"1200000000000000", "1.20 Q"}, 1703495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"4503599627370495", "4.50 Q"}, 1704495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"4503599627370496", "4.50 Q"}, 1705495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"8990000000000000", "8.99 Q"}, 1706495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"9008000000000000", "9.00 Q"}, // Number doesn't precisely fit into a double 1707495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"9456000000000000", "9.00 Q"}, // Number doesn't precisely fit into a double 1708495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"10000000000000000", "10.00 Q"}, // Number doesn't precisely fit into a double 1709495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"9223372036854775807", "9223.00 Q"}, // Maximum 64-bit precision 1710495cb271e305cfb399d463f32210a371198f0abfFredrik Roubert {"9223372036854775808", "9,223,372,036,854,775,808"}, // We've gone beyond 64-bit precision. This can only be represented with BigDecimal. 1711f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert }; 1712f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert doTest(rbnf, enTestFullData, false); 1713f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert } 171405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 171505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert private void assertEquals(String expected, String result) { 171605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert if (!expected.equals(result)) { 171705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert errln("Expected: " + expected + " Got: " + result); 171805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert } 171905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert } 172005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert 172105fa7802d0874812c234a29745586677ee5837eaFredrik Roubert @Test 172205fa7802d0874812c234a29745586677ee5837eaFredrik Roubert public void testRoundingUnrealNumbers() { 172305fa7802d0874812c234a29745586677ee5837eaFredrik Roubert RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(ULocale.US, RuleBasedNumberFormat.SPELLOUT); 172405fa7802d0874812c234a29745586677ee5837eaFredrik Roubert rbnf.setRoundingMode(BigDecimal.ROUND_HALF_UP); 172505fa7802d0874812c234a29745586677ee5837eaFredrik Roubert rbnf.setMaximumFractionDigits(3); 172605fa7802d0874812c234a29745586677ee5837eaFredrik Roubert assertEquals("zero point one", rbnf.format(0.1)); 172705fa7802d0874812c234a29745586677ee5837eaFredrik Roubert assertEquals("zero point zero zero one", rbnf.format(0.0005)); 172805fa7802d0874812c234a29745586677ee5837eaFredrik Roubert assertEquals("infinity", rbnf.format(Double.POSITIVE_INFINITY)); 172905fa7802d0874812c234a29745586677ee5837eaFredrik Roubert assertEquals("not a number", rbnf.format(Double.NaN)); 173005fa7802d0874812c234a29745586677ee5837eaFredrik Roubert } 1731aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin} 1732