2014-01-14 2 views
3

double 형식의 목록을 이중 형식으로 변환하려고합니다. 나는 목록에 넣고 Double.parseDouble(string) 방법을 사용하여이 작업을 수행했습니다.문자열에서 이중으로 변환하여 후행 0을 제거합니다.

이 값은 대부분의 숫자에서 사용할 수 있지만 두 번째 숫자 뒤에 0이 포함되어 있으면 원치 않는 결과가 나타납니다. 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 

을하지만 후행 0을합니다. 형식화 된 선을 사용할 때의 문제점은 값을 인쇄 할 때 원하는 부동 소수점 정확도를 지정해야한다는 것입니다. 그러나 숫자를 특정 점으로 정확하게 만들려는 특정 욕구가 없으며 단지 0을 그대로 두십시오. 그들은 거기에있다.

내가 잘못 접근하고 있습니까?

+5

실제 이중 값에 대해 말할 때 "후행 제로"와 같은 것은 없습니다. –

+0

Dang, @BrianRoach가 나를 이겼습니다. 문제에 대한 해결책이 있지만 @leigero가 아닙니다. 출력에 항상 10 진수가'n '이되도록하려면'DoubleFormat'을 사용하면됩니다 – javatarz

+0

흥미 롭습니다. 나는 n 자리 숫자를 정해 놓고 싶지 않다. 변환하기 전에 문자열을 확인하고 0을 수동으로 추가해야 할 것 같습니까? 그것은 매우 중복 된 것처럼 보입니다. – 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); 
    } 
} 

결과는 원래 문자열 및 인쇄에 대한 참조를 저장할 수 있습니다. BigDecimal은 후행 0을 유지합니다.

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 + " "); 
} 
+0

+1 - 나는 이것이 하나의 접근 방식 일 것이라고 언급했다. –

+0

배열이 다른 많은 클래스에서 볼 수 있고 MyDouble에 종속되지 않게하려면 MyDouble을 java.lang의 하위 클래스로 만들 수있다. 대신'Number' 배열을 지정하십시오. – twj

-1

한번에 사용하기 : 숫자

+0

이것은 작동하지 않습니다. – Keppil

0

인쇄

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

동안 항상 n 진수를 원한다면, 당신은 다음을 수행 할 수

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

보다 구체적으로,이 솔루션은 작동을 당신은하지만 @BrianRoach 그의 코멘트에서 언급 한, 실제 후배 숫자에 대해 이야기 할 때 후행 0 같은 건 없다.

-15.210 45.801 124.50 
+1

이것은 OP 설명에 맞지 않습니다. _ 특정 숫자로 정확한 숫자를 만들려는 특정 의향이 없으며, 0이있는 경우 0을 그대로 두십시오. – Keppil

+0

@Keppil 두 번째 (완전한) 솔루션은 실제로 "입력"인'values' 배열의 값을 출력하고 요구 사항을 완벽하게 채 웁니다. 누가 내 솔루션에 부정 투표를했는지 확실하지 않지만 투표를하기 전에 내 솔루션을 완전히 읽었 으면 좋겠다. : – javatarz

0

당신은 값을 처리하는 BigDecimal을 사용할 수

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)] + " "); 
} 
관련 문제