2014-01-14 82 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 + " "); 
}