سؤال

أحاول أن أفهم المزيد عن جافا تنسيق الرسالة المرافق، وفي الأمثلة في قاعدة التعليمات البرمجية لدينا وفي أماكن أخرى أرى كليهما {0} و {0,number,integer} يتم استخدامه للأرقام، لكنني لست متأكدًا من الأفضل، إذا كان أي منهما.

اختبار سريع لطباعة الاختلافات:

import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class MessageFormatTest
{
    public static void main(String[] args){
        MessageFormat simpleChoiceTest = new MessageFormat("{0}");
        MessageFormat explicitChoiceTest = new MessageFormat("{0,number,integer}");
        int[] set = new int[]{0,1,4,5,6,10,10000,24345};
        Locale[] locs = new Locale[]{Locale.US,Locale.UK,Locale.FRANCE,Locale.GERMANY};
        for(Locale loc : locs){
            simpleChoiceTest.setLocale(loc);
            explicitChoiceTest.setLocale(loc);
            for(int i : set){
                String simple = simpleChoiceTest.format(new Object[]{i});
                String explicit = explicitChoiceTest.format(new Object[]{i});
                if(!simple.equals(explicit)){
                    System.out.println(loc+" - "+i+":\t"+simple+
                        "\t"+NumberFormat.getInstance(loc).format(i));
                    System.out.println(loc+" - "+i+":\t"+explicit+
                        "\t"+NumberFormat.getIntegerInstance(loc).format(i));
                }
            }
        }
    }
}

النواتج:

fr_FR - 10000:  10 000  10 000
fr_FR - 10000:  10,000  10 000
fr_FR - 24345:  24 345  24 345
fr_FR - 24345:  24,345  24 345
de_DE - 10000:  10.000  10.000
de_DE - 10000:  10,000  10.000
de_DE - 24345:  24.345  24.345
de_DE - 24345:  24,345  24.345

الذي فاجأني، إذا كان هناك أي شيء كنت أتوقعه {0} لعدم القيام بأي شيء لعدد، و {0,number,integer} لتوطينه بشكل صحيح.بدلاً من ذلك، يتم ترجمة كلاهما، ولكن يبدو أن النموذج الصريح يستخدم دائمًا الترجمة en_US.

ووفقا للوثائق المرتبطة، {0} يتم وضعها من خلال NumberFormat.getInstance(getLocale()) بينما بينما يستخدم النموذج الصريح NumberFormat.getIntegerInstance(getLocale()).ومع ذلك، عندما أقوم باستدعاء هذين العمودين مباشرة (العمود الأخير في المخرجات)، يبدو كلاهما متطابقين، ويتم تحديد موقعهما بشكل صحيح.

ما الذي أفتقده هنا؟

هل كانت مفيدة؟

المحلول

أنت محق.عند استخدام "MessageFormat("{0,number,integer}"))، يستخدم المنسق اللغة الافتراضية (en_US) في وقت التهيئة ويتم وضع علامة على الأرقام لاستخدام تنسيق Integer في اللغة الافتراضية (en_US) كما يتم تنفيذ التعليمات البرمجية أدناه خلال وقت التهيئة نفسه.

// this method is internally called at the time of initialization
MessageFormat.makeFormat()
// line below uses default locale if locale is not
// supplied at initialization (constructor argument) 
newFormat = NumberFormat.getIntegerInstance(locale);

وبما أنك تقوم بتعيين الإعدادات المحلية بعد ذلك، فلن يكون هناك أي تأثير على نمط التنسيق المخصص للأرقام.إذا كنت تريد استخدام لغة الرغبة في تنسيق الأرقام، فيرجى استخدام وسيطة اللغة في وقت التهيئة نفسها، على سبيل المثال.أقل:

MessageFormat test = new MessageFormat("{0,number,integer}", Locale.FRANCE);

نصائح أخرى

في رأيي، هذا خطأ في Java (الواجهة خاطئة) أو مشكلة في التوثيق.يجب عليك فتح مشكلة جديدة في Oracle لتصحيح ذلك.

كما قال Yogendra Singh، يتم إنشاء مثيل المنسق (DecimalFormat) عندما يتم إنشاء مُنشئ messageFormat.

MessageFormat simpleChoiceTest = new MessageFormat("{0}");
System.out.println(simpleChoiceTest.getFormatsByArgumentIndex()[0]);
//Prints null
MessageFormat explicitChoiceTest = new MessageFormat("{0,number,currency}");
System.out.println(explicitChoiceTest.getFormatsByArgumentIndex()[0]);
//Prints java.text.DecimalFormat@67500

عند استدعاء messageFormat.setLocale، فإنه لا يغير لغة المنسقات الداخلية الخاصة به.

يجب تغيير الوثائق على الأقل لتعكس هذه المشكلة.

هذا هو إصدار جافا الخاص بي:إصدار Java "1.7.0_07" Java (TM) SE البيئة وقت التشغيل (بناء 1.7.0_07-B11)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top