2009-07-31 19 views
5

मैं वैज्ञानिक नोटेशन में संख्याओं को मुद्रित करने के लिए जावा के DecimalFormat कक्षा का उपयोग कर रहा हूं। हालांकि, मेरे पास एक समस्या है। मूल्य के बावजूद मुझे तारों की निश्चित लंबाई होने की आवश्यकता है, और दस की शक्ति पर हस्ताक्षर इसे फेंक रहा है। 1.0E1, 1.0E1, -1.0E1, और -1.0E-1:जावा डेसिमलफॉर्मैट वैज्ञानिक नोटेशन प्रश्न

DecimalFormat format = new DecimalFormat("0.0E0"); 

यह मैं निम्नलिखित संयोजन देता है: वर्तमान में, यह है कि क्या मेरी प्रारूप की तरह लग रहा है।

मैं पाने के लिए setPositivePrefix उपयोग कर सकते हैं: + 1.0E1, + 1.0E1, -1.0E1, और -1.0E -1, या जो कुछ भी मुझे पसंद है, लेकिन यह बिजली के हस्ताक्षर को प्रभावित नहीं करता !

क्या ऐसा करने का कोई तरीका है ताकि मैं निश्चित लंबाई तार कर सकूं? धन्यवाद!

संपादित करें: आह, तो जावा के मौजूदा DecimalFormat API का उपयोग करके ऐसा करने का कोई तरीका नहीं है? सुझावों के लिए धन्यवाद! मुझे लगता है कि मुझे DecimalFormat उपclass करना पड़ सकता है क्योंकि मैं पहले से मौजूद इंटरफ़ेस द्वारा सीमित हूं।

उत्तर

2

यहां एक तरीका है। सस्ती, शायद, लेकिन यह काम करता है ...

public class DecimalFormatTest extends TestCase { 
    private static class MyFormat extends NumberFormat { 
     private final DecimalFormat decimal; 

     public MyFormat(String pattern) { 
      decimal = new DecimalFormat(pattern); 
     } 

     public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { 
      StringBuffer sb = new StringBuffer(); 
      sb.append(modified(Math.abs(number) > 1.0, decimal.format(number, toAppendTo, pos).toString())); 
      return sb; 
     } 

     private String modified(boolean large, String s) { 
      return large ? s.replace("E", "E+") : s; 
     } 

     public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { 
      StringBuffer sb = new StringBuffer(); 
      sb.append(modified(true, decimal.format(number, toAppendTo, pos).toString())); 
      return sb; 
     } 

     public Number parse(String source, ParsePosition parsePosition) { 
      return decimal.parse(source, parsePosition); 
     } 

     public void setPositivePrefix(String newValue) { 
      decimal.setPositivePrefix(newValue); 
     } 
    } 
    private MyFormat format; 

    protected void setUp() throws Exception { 
     format = new MyFormat("0.0E0"); 
     format.setPositivePrefix("+"); 
    } 

    public void testPositiveLargeNumber() throws Exception { 
     assertEquals("+1.0E+2", format.format(100.0)); 
    } 

    public void testPositiveSmallNumber() throws Exception { 
     assertEquals("+1.0E-2", format.format(0.01)); 
    } 

    public void testNegativeLargeNumber() throws Exception { 
     assertEquals("-1.0E+2", format.format(-100.0)); 
    } 

    public void testNegativeSmallNumber() throws Exception { 
     assertEquals("-1.0E-2", format.format(-0.01)); 
    } 
} 

वैकल्पिक रूप से आप उपवर्ग DecimalFormat, लेकिन मैं इसे आम तौर पर क्लीनर नहीं पा सके ठोस वर्ग से उपवर्ग के लिए।

2

आप printf() बजाय का उपयोग किया जा सका:

Format format = new DecimalFormat("0.0E0"); 
Double d = new Double(.01); 
System.out.println(format.format(d)); 
System.out.printf("%1.1E\n", d); 
d = new Double(100); 
System.out.println(format.format(d)); 
System.out.printf("%1.1E\n", d); 

आउटपुट:

1.0E-2 
1.0E-02 
1.0E2 
1.0E+02 

आप के बजाय एक String के उत्पादन की जरूरत है, तो आप Formatted Printing for Java (sprintf) पर उपलब्ध कराई गई जानकारी का उपयोग कर सकते है कि क्या करना है।

संपादित करें: वाह, कि PrintfFormat() बात बहुत बड़ा है और अनावश्यक प्रतीत हो रहा है:

OutputStream b = new ByteArrayOutputStream(); 
PrintStream p = new PrintStream(b); 
p.printf("%1.1E", d); 
System.out.println(b.toString()); 

मैं Get an OutputStream into a String से ऊपर कोड के लिए विचार आया।

4

यह मैं रूप में काम किया,

DecimalFormatSymbols SYMBOLS = DecimalFormatSymbols.getInstance(Locale.US); 

    if (value > 1 || value < -1) { 
     SYMBOLS.setExponentSeparator("e+"); 
    } else { 
     SYMBOLS.setExponentSeparator("e"); 
    } 

    DecimalFormat format = new DecimalFormat(sb.toString(), SYMBOLS); 
-1

क्यों बजाय "0.0E + 0" पैटर्न का उपयोग नहीं? अंतिम शून्य से पहले प्लस साइन नोट करें।

+0

के लिए उपयोगी है क्योंकि एक 'java.lang.IllegalArgumentException' पाठ वाले में सुझाव दिया पैटर्न परिणाम: _Malformed घातीय पैटर्न" 0.0E + 0 "_ –

0

उपयोग कैसे करें?
formatTest विधि देखें।

if (value.compareTo(positive) == 1 || value.compareTo(negative) == -1) बहुत बड़ी संख्या

/** 
* inspired by:<br> 
* https://stackoverflow.com/a/13065493/8356718 
* https://stackoverflow.com/a/18027214/8356718 
* https://stackoverflow.com/a/25794946/8356718 
*/ 
public static String format(String number, int scale) { 
    BigDecimal value = new BigDecimal(number); 
    DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(Locale.US); 
    BigDecimal positive = new BigDecimal(1);// scale is zero 
    positive.setScale(0);// unnecessary 
    BigDecimal negative = new BigDecimal(-1);// scale is zero 
    negative.setScale(0);// unnecessary 
    if (value.compareTo(positive) == 1 || value.compareTo(negative) == -1) { 
     symbols.setExponentSeparator("e+"); 
    } else { 
     symbols.setExponentSeparator("e"); 
    } 
    DecimalFormat formatter = new DecimalFormat("0.0E0", symbols); 
    formatter.setRoundingMode(RoundingMode.HALF_UP); 
    formatter.setMinimumFractionDigits(scale); 
    return formatter.format(value); 
} 

/** 
* set the scale automatically 
*/ 
public static String format(String number) { 
    BigDecimal value = new BigDecimal(number); 
    return format(number, value.scale() > 0 ? value.precision() : value.scale()); 
} 

/* 
output: 
---------- 
0e0 
1.0e-2 
-1.0e-2 
1.234560e-5 
-1.234560e-5 
1e0 
-1e0 
3e+0 
-3e+0 
2e+2 
-2e+2 
---------- 
0.0000000000e0 
1.0000000000e-2 
-1.0000000000e-2 
1.2345600000e-5 
-1.2345600000e-5 
1.0000000000e0 
-1.0000000000e0 
3.0000000000e+0 
-3.0000000000e+0 
2.0000000000e+2 
-2.0000000000e+2 
---------- 
*/ 
public static void formatTest() { 
    System.out.println("----------"); 
    System.out.println(format("0")); 
    System.out.println(format("0.01")); 
    System.out.println(format("-0.01")); 
    System.out.println(format("0.000")); 
    System.out.println(format("-0.000")); 
    System.out.println(format("1")); 
    System.out.println(format("-1")); 
    System.out.println(format("3")); 
    System.out.println(format("-3")); 
    System.out.println(format("200")); 
    System.out.println(format("-200")); 
    System.out.println("----------"); 
    System.out.println(format("0", 10)); 
    System.out.println(format("0.01", 10)); 
    System.out.println(format("-0.01", 10)); 
    System.out.println(format("0.000", 10)); 
    System.out.println(format("-0.000", 10)); 
    System.out.println(format("1", 10)); 
    System.out.println(format("-1", 10)); 
    System.out.println(format("3", 10)); 
    System.out.println(format("-3", 10)); 
    System.out.println(format("200", 10)); 
    System.out.println(format("-200", 10)); 
    System.out.println("----------"); 
} 
+0

आप संपादित करें इस सवाल का जवाब देने के लिए एक स्पष्टीकरण शामिल करने के लिए पोस्ट करें। –

संबंधित मुद्दे