Je suis sûr qu'il y a un moyen plus élégant, mais voyez si cela fonctionne?
import static org.junit.Assert.assertEquals;
import java.text.ChoiceFormat;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.NumberFormat;
import java.text.ParsePosition;
import org.junit.Test;
public class NumberFormatTest {
@Test
public void testNumberFormat() {
NumberFormat nf = new MyNumberFormat();
assertEquals("-1234.4", nf.format(-1234.4));
assertEquals("0.0", nf.format(0));
assertEquals("+0.3", nf.format(0.3));
assertEquals("+12.0", nf.format(12));
}
}
class MyNumberFormat extends NumberFormat {
private DecimalFormat df = new DecimalFormat("0.0#");
private ChoiceFormat cf = new ChoiceFormat(new double[] { 0.0,
ChoiceFormat.nextDouble(0.0) }, new String[] { "", "+" });
@Override
public StringBuffer format(double number, StringBuffer toAppendTo,
FieldPosition pos) {
return toAppendTo.append(cf.format(number)).append(df.format(number));
}
@Override
public StringBuffer format(long number, StringBuffer toAppendTo,
FieldPosition pos) {
return toAppendTo.append(cf.format(number)).append(df.format(number));
}
@Override
public Number parse(String source, ParsePosition parsePosition) {
throw new UnsupportedOperationException();
}
}
Selon DecimalFormat
Le sous-motif négatif est facultative; en cas d'absence, le sous-motif positif préfixé par le signe moins localisé (« - » dans la plupart des lieux) est utilisé comme sous-modèle négatif
Par conséquent new DecimalFormat("0.0#")
est équivalent à new DecimalFormat("0.0#;-0.0#")
Alors cela nous donnerait: -1234.5
et 1234.5
maintenant, pour ajouter le '+' aux numéros positve, j'utilise un ChoiceFormat
0.0 <= X < ChoiceFormat.nextDouble(0.0)
utilisera un format de choix de ""
. ChoiceFormat.nextDouble(0.0)
est le plus petit nombre supérieur à 0.0
.
ChoiceFormat.nextDouble(0.0) <= X < 1
utilisera un format de choix de "+"
.
S'il n'y a pas de correspondance, alors soit le premier ou le dernier indice est utilisé, selon que le nombre (X) est trop faible ou trop élevée. Si le tableau de limite n'est pas dans l'ordre croissant, les résultats du formatage seront incorrects. ChoiceFormat accepte également \ u221E comme équivalent à l'infini (INF).
Par conséquent
Double.NEGATIVE_INFINITY <= X < 0
utilisera ""
.
1 <= X < Double.POSITIVE_INFINITY
utilisera "+"
.
Est-ce un long chemin, rond-point de dire que ChoiceFormat est ce qu'il cherche? –