Java NumberFormat.getNumberInstance (Locale) несовместим для негативного префикса - PullRequest
0 голосов
/ 04 декабря 2018

Попытка отформатировать отрицательное число в строку, используя:

(DecimalFormat) NumberFormat.getNumberInstance(new Locale("no")));

Используя jdk-10.0.2.Я обнаружил, что Норвегия и некоторые другие страны используют Unicode-символ 'MINUS SIGN' (U + 2212) для отрицательного префикса, в то время как большинство других стран используют Unicode-символ 'HYPHEN-MINUS' (U + 002D).Это проблема, поскольку тесты не проходят на равных, и на моем Mac все отрицательные префиксы HYPHEN-MINUS.

Решение, которое я нашел, заключается в вызове setNegativePrefix ("-") после получения DecimalFormat для переопределения странных локальных отрицательных префиксов.

Пожалуйста, также посмотрите обходной путь в Orcale (конец страницы) https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8214926.

@Test
public void norwegianNegativePrefixDifferentFromEnglish() throws UnsupportedEncodingException {
    Assertions.assertThat(((DecimalFormat) NumberFormat.getNumberInstance(new Locale("no"))).getNegativePrefix())
            .isEqualTo(((DecimalFormat) NumberFormat.getNumberInstance(new Locale("en"))).getNegativePrefix());
}

Кто-нибудь знает почему?Выполнение этой Java дает присоединенные результаты:

    public void fintLocals() {
    HashMap<String, List<String>> negativeSignAndLocals = new HashMap<String, List<String>>();
    for (Locale locale : Locale.getAvailableLocales()) {
        DecimalFormat formatForLocal = ((DecimalFormat) NumberFormat.getNumberInstance(locale));
        // System.out.println(formatForLocal.getNegativePrefix()+ " minus for "+locale);
        List<String> negLoc = negativeSignAndLocals.get(formatForLocal.getNegativePrefix());
        if (negLoc == null) {
            negativeSignAndLocals.put(formatForLocal.getNegativePrefix(), new ArrayList<>());
        }
        negativeSignAndLocals.get(formatForLocal.getNegativePrefix()).add(locale.toString());
    }
    for (Map.Entry<String, List<String>> entry : negativeSignAndLocals.entrySet()) {

        System.out.println("Negative sign = " + entry.getKey() + " as Hex value " + charToHex(entry.getKey().charAt(0))
                + " are used by: " + (String) String.join(",", entry.getValue()));
    }
}

static public String byteToHex(byte b) {
    // Returns hex String representation of byte b
    char hexDigit[] = {
            '0', '1', '2', '3', '4', '5', '6', '7',
            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
    };
    char[] array = {hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f]};
    return new String(array);
}

static public String charToHex(char c) {
    // Returns hex String representation of char c
    byte hi = (byte) (c >>> 8);
    byte lo = (byte) (c & 0xff);
    return byteToHex(hi) + byteToHex(lo);
}

Отрицательный знак - в качестве значения Hex 2212 используются: nn, sv_SE, sv, se_NO, nb_SJ, no_NO_NY, sv_FI, no, ksh, gsw_CH, et,gsw, gsw_FR, fi, et_EE, rm, nb_NO, fi_FI, rm_CH, ksh_DE, se_FI, no_NO, lt_LT, nn_NO, se_SE, se, fo_DK, fo_FO, fo, lt, gsw_LI, sv_AX, nb * 1015016 * Отрицательный знак - в качестве шестнадцатеричного значения 002d используются:KKJ, sr_ME, es_BO, dz_BT, MER, сах, en_ZM, fr_ML, ш, ha_NG, bs_BA, dsb_DE, ск, os_GE, мл, en_MT, en_LR, en_GH, en_IL, CS, эль, tzm_MA, аф, sw_UG, ses_ML,SMN, tk_TM, sr_ME_ # Cyrl, DSB, lkt_US, vai_LR_ # Latn, ji_001, yo_NG, KHQ, sw_CD, vo_001, en_PW, pl_PL, fil_PH, sr_CS, ne_IN, es_PH, es_ES, es_CO, bg_BG, джи, bs_BA_ # Latn,en_VC, es_US, AGQ, hsb_DE, en_US_POSIX, en_150, en_KN, ha_NE, pt_MO, EBU, ro_RO, ж __ # Ганс, lb_LU, sr_ME_ # Latn, es_GT, so_KE, dje_NE, bas_CM, fr_PM, fr_MG, es_CL, млн, agq_CM,kam_KE, Teo, tr_TR, ес, en_MO, ши __ # TFNG, en_BZ, sq_AL, es_DO, ру, twq_NE, аз, nmg_CM, kl_GL, en_NR, й, кк, аз __ # Cyrl, en_MP, en_GD, тк, гип, ши __ #Latn, en_BW, en_AU, en_CY, kab_DZ, kde_TZ, ta_MY, ti_ER, nus_SS, en_RW, nd_ZW, KSB, Luo, фунты, пе, en_IE, zh_sg, ln_CD, en_KI, nnh_CM, om_ET, ja_JP мой, ка, MGH,or_IN, fr_MF, ши, К.Л., yue_HK, en_SZ, rwk_TZ, ж, es_PE, mgh_MZ, SAQ, аз __ # Latn, та, en_GB, лаг, zh_HK_ # Hant, ksf_CM, бо, kk_KZ, es_PA, om_KE, en_AS, fr_VU,zh_TW, Bez, KLN, fr_MC, кВт, pt_MZ, fr_NE, вай __ # Latn, ksb_TZ, пер, en_JE, ln_CF, uz_AF, en_CX, luy_KE, пт, en_AT, Г.Л., kkj_CM, стер __ # Cyrl, es_GQ, kn_IN, чтобы, en_SX, га, Цюй, ru_KZ, en_TZ, en_PR,муа, ko_KP, в, зп, nl_SR, ROF, en_BS, км, ZGH, fr_NC, быть, г.в., эс, дуа, gd_GB, JGO, nl_BQ, fr_CM, uz_UZ_ # Cyrl, pa_IN_ # Гуру, en_KE, Гузь, МФБ,asa_TZ, teo_UG, Ja, fr_SN, или, BRX, fr_MA, pt_LU, fr_BL, en_NL, mgo_CM, ln_CG, т.е, az_AZ, SL, ko_KR, el_CY, mr_IN, ха, es_MX, es_HN, hu_HU, ff_SN, SBP, sq_MK,sr_BA_ # Cyrl, UZ, шс __ # Cyrl, ср __ # Latn, en_SS, SW, bo_IN, fy_NL, tr_CY, NMG, en_MG, fr_BI, shi_MA, uz_UZ_ # Latn, млрд, dua_CM, VAI __ # Vaii, К.Н., fr_TN, sr_RS,de_CH, bn_BD, ИПВ, fr_PF, en_ZA, гу, pt_GQ, vun_TZ, jmc_TZ, en_TV, се, fr_FR, en_PN, pa_IN, en_MH, fr_BJ, vai_LR, ж __ # Hant, cu_RU, zh_HK_ # Ганс, nl_NL, sah_RU, en_GY,бс __ # Latn, KY, фонтанная, dyo_SN, Os, bs_BA_ # Cyrl, nl_CW, sk_SK, pt_CH, fr_GQ, ff_CM, утра, en_NG, fr_CI, ki_KE, en_PK, zh_CN, en_LC, RW, brx_IN, gv_IM, mk_MK, en_TT,ДАВ, sl_SI, fr_HT, te_IN, nl_SX, SES, се, fr_CG, fr_BE, jgo_CM, mt_MT, es_VE, мг, г-н, mer_KE, ко, en_BM, ак, SEH, KDE, DZ, kea_CV, MgO, vi_VN, en_VU,en_US, to_TO, mfe_MU, seh_MZ, fr_BF, ра __ # Guru, it_SM, fr_YT, gu_IN, ii_CN, аст, fr_RE, ca_FR,sr_BA_ # Latn, bn_IN, fr_GP, ра, zgh_MA, uk_UA, fr_DJ, р-н, RWK, ху, fr_CH, en_NF, TWQ, ha_GH, sr_XK_ # Cyrl, Ьт, en_GU, nl_AW, de_BE, en_AI, en_CM, xog_UG, cs_CZ,тр, ca_ES, CGG, nyn_UG, ru_MD, ms_MY, ta_LK, СБК, en_TO, су, en_PG, fr_CF, pt_TL, кв, пт, en_ER, qu_PE, sr_BA, es_PY, де, es_EC, kok_IN, lg_UG, zu_ZA, fr_TG,sr_XK_ # Latn, en_PH, ig_NG, fr_GN, prg_001, cgg_UG, zh_MO_ # Ганс, Л.Г., ru_RU, и далее, en_DM, en_CK, ga_IE, en_BI, en_AG, fr_TD, en_WS, fr_LU, ebu_KE, bem_ZM, xog, ewo_CM, fr_CD,так, rn_BI, en_NA, KAB, мс, НУК, sn_ZW, PRG, мкг, es_EA, th_TH_TH_ # U-ну-тай, привет, fr_SC, ca_IT, lag_TZ, en_SL, teo_KE, ca_AD, zh_MO_ # Hant, en_SH, ваи,qu_BO, haw_US, VI, fr_CA, de_LU, sq_XK, Dyo, en_KY, мт, it_CH, de_DE, si_LK, luo_KE, en_DK, Явь, so_DJ, it_IT, ео, кама, en_ZW, ро, eo_001, эи, en_UM, fr_MU,пл, en_TK, en_SI, mua_CM, vai_LR_ # Vaii, saq_KE, pt_GW, lo_LA, CHR, af_ZA, ms_SG, ee_TG, ln_AO, be_BY, ff_GN, in_ID, hr_HR, Luy, так как, rof_TZ, это, pt_CV, Великобритания, my_MM,mn_MN, da_DK, en_FM, es_PR, wae_CH, en_BE, II, fr_WF, ru_BY, ВНС, en_SG, ee_GH, kln_KE, ПЗМ, мех, ом, hi_IN, en_CH, аса, yo_BJ, ast_ES, fr_KM, bez_TZ, fr_MQ, en_SD,es_AR, en_MY, ja_JP_JP_ # у-ча-японский, es_SV, pt_БР, ml_IN, sbp_TZ, фил, en_FK, UZ __ # Cyrl, is_IS, hy_AM, en_GM, en_DG, ne_NP, ч, pt_ST, ak_GH, fur_IT, ta_IN, en_SE, fr_GF, LKT, zh_CN_ # Ганс, это, es_419, си,pt_AO, en_001, еп, guz_KE, es_IC, ча, ru_KG, fr_MR, zh_TW_ # Hant, bm_ML, pa_PK, kw_GB, ug_CN, as_IN, es_BR, zh_hk, khq_ML, sw_KE, en_SB, th_TH, rw_RW, chr_US, shi_MA_ # TFNG,Нин, Yue, JMC, en_MW, naq_NA, тк, en_IO, en_DE, en_CC, бс, ro_MD, en_FI, pt_PT, FY, az_AZ_ # Cyrl, й, dav_KE, uz_UZ, shi_MA_ # Latn, es_CU, en_SC, en_VI, ограда,eu_ES, en_UG, en_NZ, дже, es_UY, барельеф, mas_KE, ru_UA, sg_CF, el_GR, yav_CM, UZ __ # Latn, SG, da_GL, en_FJ, de_LI, en_BB, km_KH, smn_FI, hr_BA, de_AT, п, lu_CD, ca_ES_VALENCIA,so_SO, lv_LV, es_CR, fr_GA, стер, sr_RS_ # Cyrl, бьем, en_MU, да, WAE, gl_ES, en_IM, az_AZ_ # Latn, en_LS И.Г., en_HK, en_GI, ce_RU, en_CA, Gd, ka_GE, fr_SY, sw_TZ,fr_RW, so_ET, nl_BE, mg_MG, cy_GB, en_VG, куб, os_RU, sr_RS_ # Latn, en_TC, ky_KG, af_NA, VUN, en_IN, лу, ки, лет, es_NI, ff_MR, mas_TZ, ти, кок, Эво, ms_BN,br_FR

Отрицательный знак в качестве значения Hex 200e используются: fa_AF, ar_EH, fa_IR, ar_MR, fa, ur_IN, ps, lrc_IR, lrc_IQ, ps_AF, ar_DZ, iw, lrc, pa_PK_ # арабский, ar_MA, iw_IL, ur,uz __ # арабский, ar_LB, ks_IN, ur_PK, mzn, mzn_IR, uz_AF_ # арабский, ar_TN, ks, pa __ # арабский, ar_LY

Отрицательный знак в виде шестнадцатеричного значения 200f используется: ar_JO, ar_SA, ar_TD,ar_EG, ar_SD, ar_KM, ar_IL, ar_SY, ar_PS, ar_YE, ar_OM, ar_SS, ar_ER, ar_SO, ar_AE, ar_BH, ar_IQ, ar_QA, ckb_IQ, ар, ckb_IR, ar_001, CKB, ar_KW, ar_DJ * * одна тысяча двадцать-одна

...