2010-09-14 6 views
0

J'ai une chaîne "+1.29%" ou "-1.29%"Comment comparer les pourcentages qui sont des chaînes?

Comment puis-je convertir en un flotteur ou double pour que je puisse comparer les valeurs?

Voici comment ma classe de comparaison ressemble à:

package org.stocktwits.helper; 

import java.util.Comparator; 

import org.stocktwits.model.Quote; 

    public class PercentChangeComparator implements Comparator<Quote> 
    { 
     public int compare(Quote o1, Quote o2) { 
      try{ 
       String subChange1 = o1.getPercentChange(); 
       String subChange2 = o2.getPercentChange(); 

       float change1 = Float.valueOf(subChange1.substring(0, subChange1.length() - 1)); 
       float change2 = Float.valueOf(subChange2.substring(0, subChange2.length() - 1)); 

       if (change1 < change2) return -1; 
       if (change1 == change2) return 0; // Fails on NaN however, not sure what you want 
       if (change2 > change2) return 1; 

       return 0; 
      }catch(NullPointerException e){ System.out.println(e); return 0;} 
      catch(NumberFormatException e){ System.out.println(e); return 0;} 
     } 
    } 

Répondre

4

Qu'en est-dépouillant le symbole pour cent, puis la conversion en nombre?

s.substring(0, s.length - 1) 
+0

Je pensais que - mais n'a pas répondu que je pensais que je manque quelque chose lol. –

+0

Plutôt que de vérifier change1 et de changer et retourner 1, 0 ou -1. Il pourrait être plus facile de simplement "retourner change2 - change1;" – Dunderklumpen

+0

Chaîne subChange1 = o1.getPercentChange(); \t \t chaîne foo = subChange1.substring (0, subChange1.length() - 1); // me donne une exception nullpointer ... –

1

Surveillez la gestion des exceptions. Renvoyer 0 signifie que les valeurs sont égales, ce que vous pourriez ne pas vouloir lorsque les chaînes ne sont pas valides.

Quoi qu'il en soit, essayez quelque chose comme ceci:

DecimalFormat df = new DecimalFormat("+####.##%;-####.##%"); 
Double double1 = (Double)df.parse("+12.34%"); 
Double double2 = (Double)df.parse("-12.34%"); 

//including test 
assertThat(double1, equalTo(Double.valueOf(.1234))); 
assertThat(double2, equalTo(Double.valueOf(-.1234))); 

assertThat(double1.compareTo(double2), equalTo(1)); 
assertThat(double1.compareTo(double1), equalTo(0)); 
assertThat(double2.compareTo(double1), equalTo(-1)); 
Questions connexes