2014-01-14 111 views
3

我想將雙精度字符串格式的列表轉換爲雙精度格式。我通過將它們放入列表並使用Double.parseDouble(string)方法來完成此操作。從字符串轉換爲雙刪除尾隨零

這適用於大多數數字,但當double包含尾隨零時parseDouble方法將其刪除時,它會提供不需要的輸出。我不希望這個被刪除。

String[] values = {"124.50", "45.801", "-15.210"}; 
List<Double> nums = new ArrayList<Double>(); 

for(String s: values) 
nums.add(Double.parseDouble(s)); 
Collections.sort(nums); 

for(Double d: nums){ 
    System.out.print(d + " "); 
} 

這樣產生的輸出:

-15.21 45.801 124.5 

但是我想尾隨零。使用格式化線的問題在於,我必須指定打印值時所需的浮點精度,但我沒有任何具體的要求使數字精確到某個點,只需將零置於單獨的位置即可他們在那裏。

我接近這個錯誤嗎?

+5

在討論實際雙值時,沒有「尾隨零」這樣的事情。 –

+0

Dang,@BrianRoach擊敗了我。有問題的解決方案,但他們不是直接@leigero。如果你想讓輸出始終有n個十進制數字,你可以使用'DoubleFormat' – javatarz

+0

有趣。我不想要一組數字n。我想我必須在轉換之前檢查字符串並手動添加零回來?這似乎非常多餘。 – leigero

回答

7

你可以存儲原始字符串和打印,代替解析雙

public static void main(String[] args) { 
    String[] values = {"124.50", "45.801", "-15.210"}; 
    List<MyDouble> nums = new ArrayList<MyDouble>(); 

    for(String s: values) 
    nums.add(new MyDouble(s)); 
    Collections.sort(nums); 

    for(MyDouble d: nums){ 
     System.out.print(d + " "); 
    } 
} 

static class MyDouble implements Comparable<MyDouble> { 
    final double val; 
    final String string; 
    MyDouble(String str) { 
     string = str; 
     val = Double.parseDouble(str); 
    } 

    @Override 
    public String toString() { 
     return string; 
    } 

    @Override 
    public int compareTo(MyDouble o) { 
     return (int) (val - o.val); 
    } 
} 

結果的引用:

-15.210 45.801 124.50 
+0

+1 - 我只是在評論這是一種方法 –

+0

如果你的數組對其他類可見並且你不希望它們依賴於MyDouble,那麼可以使MyDouble成爲java.lang的一個子類。 Number'並指定一個'Number'數組。 – twj

-1

嘗試使用:

DecimalFormat df = new DecimalFormat("###.#"); 

而印數

+0

這是行不通的。 – Keppil

0

如果你總是希望n十進制數字,你可以做到以下幾點:

final DecimalFormat df = new DecimalFormat("#.000"); 
for (Double d : nums) { 
    System.out.print(df.format(d) + " "); 
} 

更具體地說,該解決方案適用於你可以像@BrianRoach在他的評論中提到的那樣,在談論實際的雙數時,不存在尾隨零的情況。

final String[] values = {"124.50", "45.801", "-15.210"}; 
final List<Double> nums = new ArrayList<>(); 
final List<Double> bkpNums = new ArrayList<>(); 

for (final String s : values) { 
    double d = Double.parseDouble(s); 
    nums.add(d); 
    bkpNums.add(d); 
} 
Collections.sort(nums); 

for (Double d : nums) { 
    System.out.print(values[bkpNums.indexOf(d)] + " "); 
} 
+1

這不符合OP的描述:_我沒有任何具體的想讓數字準確到某個點,只是如果他們在那裏就把零置了。 – Keppil

+0

@Keppil第二個(完整)解決方案實際上是從「values」數組中打印出來的值,它是「輸入」,並且完美地符合要求。 不知道誰反對我的解決方案,但我當然希望他們會在投票前徹底閱讀我的解決方案。 :( – javatarz

0

你可以使用BigDecimal處理值。 BigDecimal保留尾隨零。

String[] values = {"124.50", "45.801", "-15.210"}; 
List<BigDecimal> nums = new ArrayList<BigDecimal>(); 

for(String s: values) 
    nums.add(new BigDecimal(s)); 
Collections.sort(nums); 

for(BigDecimal d: nums) { 
    System.out.print(d + " "); 
}