شكل سلبي بقيمة مع علامة ناقص ، وليس بين قوسين (جافا)

StackOverflow https://stackoverflow.com/questions/2056400

سؤال

كيف يمكنني الحصول على NumberFormat.getCurrencyInstance() طباعة السلبية العملات USD القيم مع ناقص التوقيع ؟

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

المحلول 6

منذ أن كنت تواجه هذه المشكلة مرة أخرى, فعلت بعض البحوث وجدت أكثر مرونة الحل المقدمة من قبل وحدة العناية المركزة:

NumberFormatter
  .withLocale(...)
  .unit(Currency.getInstance("USD"))
  .sign(SignDisplay.AUTO) // "123", "0", and "-123"
  .format(123)
  .toString();

تحقق من وثائق API من NumberFormatter للحصول على مزيد من التفاصيل.

نصائح أخرى

وويتطلب التغيير والتبديل القليل من DecimalFormat إرجاعها بواسطة NumberFormat.getCurrencyInstance() للقيام بذلك بطريقة مستقلة لغة. وهنا ما لم (اختبار على الروبوت):

DecimalFormat formatter = (DecimalFormat)NumberFormat.getCurrencyInstance();
String symbol = formatter.getCurrency().getSymbol();
formatter.setNegativePrefix(symbol+"-"); // or "-"+symbol if that's what you need
formatter.setNegativeSuffix("");

وIIRC، Currency.getSymbol() قد لا بإرجاع قيمة لكافة اللغات لجميع النظم، ولكن يجب العمل من أجل عمليات الكبرى (وأعتقد أن لديها احتياطي معقول من تلقاء نفسها، لذلك يجب أن لا يكون لفعل أي شيء)

وهنا هو واحد أنا دائما في نهاية المطاف باستخدام إما في فئة جافا أو عن طريق معاهدة المواد الانشطارية: formatNumber العلامة JSTL:

DecimalFormat format = new DecimalFormat("$#,##0.00;$-#,##0.00");
String formatted = format.format(15.5);

وكان دائما تنتج ما لا يقل عن $ 0.00 ويتسق عند عرضها. كما يتضمن آلاف seperators عند الحاجة. يمكنك نقل علامة ناقص أمام الدولار إذا كان هذا هو الشرط الخاص بك.

ربما يكون من الأفضل إنشاء الخاصة بك DecimalFormat إذا كنت ترغب في تنسيق محدد بدلا من الاعتماد على الافتراضي.

تحرير: ربما يمكن أيضا يلقي نتيجة أسلوب numberformat.getCurrencyInstance() إلى DecimalFormat وضبط التفضيلات الخاصة بك.

وجرب:

وNumberFormat.getCurrencyInstance(Locale.CANADA);

NumberFormat.getCurrencyInstance(Locale.UK);

لماذا ترفض البوي لدعم الخيار الأول في العملة التفوق تنسيق هو خارج عن ارادتي!

وأنا لا أحب استخدام DecimalFormat للعملة لأن قيمة الخلية نهاية الخاص بك تصبح غير رقمية مع إدخال رمز العملة. في حين يعمل لحساب مؤسسة مالية كبيرة، وأنا المكلفة بحل هذه القضية تنسيق. الفكرة الأساسية من هذا التغيير هو، لأن POI ترفض أن تكون معقولة وتحظى بدعم شامل من الخيارات المحلية في Excel، وسوف التسلل مدوناتها وتغيير قيمها في الصميم. ما يلي هو بلدي الحل البديل:

private static final String CURRENCY_FORMAT_OVERRIDE = "\"$\"#,##0.00_);-\"$\"#,##0.00";
private static final String CURRENCY_FORMAT_TARGET = "\"$\"#,##0.00_);(\"$\"#,##0.00)";    

static { // static class level initializer
    Field field = org.apache.poi.ss.usermodel.BuiltinFormats.class.getDeclaredField("_formats");            
    field.setAccessible(true);
    String[] _formats = (String[])field.get(new org.apache.poi.ss.usermodel.BuiltinFormats());
    for(int i = 0; i < _formats.length; ++i) {
        if(_formats[i].equals(CURRENCY_FORMAT_TARGET)) {
            _formats[i]=CURRENCY_FORMAT_OVERRIDE;
            System.out.println("TAKE THAT, POI!!!");
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top