سؤال

هل هناك طريقة لاستخدام DecimalFormat (أو أي منسق قياسي آخر) لتنسيق الأرقام مثل هذا:

1,000,000 => 1.00 مليون

1,234,567 => 1.23 مليون

1,234,567,890 => 1234.57 مليون

يتم بشكل أساسي قسمة رقم ما على مليون، والاحتفاظ بمنزلتين عشريتين، ووضع حرف "M" في النهاية.لقد فكرت في إنشاء فئة فرعية جديدة من NumberFormat ولكنها تبدو أكثر صعوبة مما كنت أتخيل.

أنا أكتب واجهة برمجة التطبيقات (API) التي تحتوي على طريقة تنسيق تبدو كما يلي:

public String format(double value, Unit unit); // Unit is an enum

داخليًا، أقوم بتعيين كائنات الوحدة إلى NumberFormatters.التنفيذ شيء من هذا القبيل:

public String format(double value, Unit unit)
{
    NumberFormatter formatter = formatters.get(unit);
    return formatter.format(value);
}

لاحظ أنه لهذا السبب، لا أستطيع أن أتوقع أن يقوم العميل بالتقسيم على مليون، ولا يمكنني فقط استخدام String.format() دون تغليفه في NumberFormatter.

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

المحلول

String.format("%.2fM", theNumber/ 1000000.0);

لمزيد من المعلومات انظر في String.format javadocs .

نصائح أخرى

لاحظ أنه إذا كان لديك BigDecimal، يمكنك استخدام الأسلوب movePointLeft:

new DecimalFormat("#.00").format(value.movePointLeft(6));

وهنا فئة فرعية من NumberFormat أنني جلد حتى. يبدو أنه لا وظيفة لكنني لست متأكدا تماما انها افضل طريقة:

private static final NumberFormat MILLIONS = new NumberFormat()
{
    private NumberFormat LOCAL_REAL = new DecimalFormat("#,##0.00M");

    public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos)
    {
        double millions = number / 1000000D;
        if(millions > 0.1) LOCAL_REAL.format(millions, toAppendTo, pos);

        return toAppendTo;
    }

    public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos)
    {
        return format((double) number, toAppendTo, pos);
    }

    public Number parse(String source, ParsePosition parsePosition)
    {
        throw new UnsupportedOperationException("Not implemented...");
    }
};

لماذا لا ببساطة؟

DecimalFormat df = new DecimalFormat("0.00M");
System.out.println(df.format(n / 1000000));

نلقي نظرة على تنسيق الاختيار.

هناك طريقة أكثر بساطة تتمثل في استخدام غلاف يتم تقسيمه تلقائيًا على 1 متر لك.

في الوقت الحالي، يجب عليك استخدام وحدة العناية المركزة CompactDecimalFormat, ، والذي سيقوم بترجمة نتيجة التنسيق للغات غير الإنجليزية.قد لا تستخدم اللغات الأخرى لاحقة "الملايين".

ستكون هذه الوظيفة Java القياسية في JDK 12 مع CompactNumberFormat.

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