0

我有一个要求取决于地图的特定键值,我需要格式化输出。

例如,如果它的值大于 1 则只需要在值 (12.23) 之后显示 2 个小数点,或者如果它的值小于 1 ,我需要在它之后显示 4 个小数点。

我已经编写了工作正常的代码,但我正在寻找一种更好的方法(基本上我不喜欢我的代码中的 if else 条件)

这是我的程序,根据最后一个属性键值,我正在格式化输出

package com;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class CustValues {

    public static void main(String args[]) {

        Map valuesMap = new HashMap();

        valuesMap.put("mktCap", "12.4d");
        valuesMap.put("last", "0.4344");
        valuesMap.put("avgvalue", "34.55");
        valuesMap.put("bidprice", "44.44");

        Iterator<String> iterator = valuesMap.keySet().iterator();

        while (iterator.hasNext()) {
            String name = iterator.next().toString();

            String value = (String) valuesMap.get(name);

            if (name.equals("last")) {

                String result = "";

                double d = Double.parseDouble(value);

                if (d > 1) {
                    result = formatNumber(value, 2);
                } else {
                    result = formatNumber(value, 4);
                }

                System.out.println(result);
            }

        }

    }

    public static String formatNumber(String s, int decPts) {
        double d = Double.parseDouble(s);

        if (2 == decPts)
            return new DecimalFormat("#,###,###,##0.00").format(d);
        else if (0 == decPts)
            return new DecimalFormat("#,###,###,##0").format(d);
        else if (3 == decPts)
            return new DecimalFormat("#,###,###,##0.000").format(d);
        else if (4 == decPts)
            return new DecimalFormat("0.0000").format(d);
        return String.valueOf(d);

    }

}
4

7 回答 7

5

您可以创建一个Map<Integer, DecimalFormat> formats(或一个List<DecimalFormat>,如果您愿意)。然后formatNumber()只需调用formats.get(decPts)以获取正确的格式。

于 2013-06-11T00:59:05.167 回答
1

基于 Code-Guru 的回答。您可以使用映射,但要保留代码变为的相同线程安全和默认行为:

public class CustValues {
    private static final Map<Integer, String> FORMATS;
    static {
        Map<Integer, String> formats = new HashMap<Integer, String>();

        formats.put( 0, "#,###,###,##0" );
        formats.put( 2, "#,###,###,##0.00" );
        formats.put( 3, "#,###,###,##0.000" );
        formats.put( 4, "0.0000" );

        FORMATS = Collections.unmodifiableMap( formats );
    }

    public static void main(String args[]) {
        // Same as before....
    }

    public static String formatNumber(String s, int decPts) {
        double d = Double.parseDouble(s);
        String format = FORMATS.get(decPts);
        if( format != null ) {
            return new DecimalFormat(format).format(d);
        }
        return String.valueOf(d);
    }
}

您需要为每个请求创建一个新的 DecimalFormat 而不是重用它,因为它不是线程安全的。这也处理 decPts 不是 0、2、3 或 4 的情况。

于 2013-06-11T01:19:26.847 回答
1

你可以使用switch句子

switch (decPts) {
  case 0:
     return new DecimalFormat("#,###,###,##0").format(d);
  case 2:
     ...

}

它有助于整理本案例的代码。ìf无论如何,如果不使用或类似的结构,您将无法使用任何语言进行编程。

于 2013-06-11T00:58:28.470 回答
1

您在formatNumber方法中实现的逻辑是 switch 语句的完美候选。尝试

switch (decPts) {
    case 0:
        return new DecimalFormat("#,###,###,##0").format(d);
        break;
    case 2:
        return new DecimalFormat("#,###,###,##0.00").format(d);
        break;
    ...
}

有关详细信息,请参阅本教程

编辑:虽然 SJuan76 击败了我,但我更喜欢 Code-Guru 的想法!

于 2013-06-11T01:01:24.807 回答
1

我有如下方法:

public static String formatNumber(String s, int decPts) {
    double d = Double.parseDouble(s);

    if (decPts >= 0 && decPts <= 4) {
        DecimalFormat df = new DecimalFormat("###,##0");
        df.setMaximumFractionDigits(decPts);
        df.setMinimumFractionDigits(decPts);
        return df.format(d);
    }

    return String.valueOf(d);

}
于 2013-06-11T01:31:03.000 回答
0

枚举具有避免装箱和拆箱 map.get 调用将执行的整数的优点,同时只创建一次您需要的格式化程序。请注意,您也可以摆脱第二个双重解析:

enum DisplayFormat {
  CURRENCY(new DecimalFormat("#,###,###,#00.00")),
  SMALL_CURRENCY(new DecimalFormat("0.000"));

  private DecimalFormat f;

  public DisplayFormat(DecimalFormat f) {
    this.f = f;
  }

  public String format(double d) {
    return this.f.format(d);
}

// Usage:

if (name.equals("last")) {
  String result = "";

  double d = Double.parseDouble(value);

  if (d > 1) {
    result = DisplayFormat.SMALL_CURRENCY.format(d)
  } else {
    result = DisplayFormat.CURRENCY.format(d)
  }

  System.out.println(result);
}    
于 2013-06-11T01:13:12.940 回答
0

一种非常低效但更灵活的选择是基于 decPts 生成格式字符串:

public static String formatNumber(String s, int decPts) {
    double d = Double.parseDouble(s);

    final String baseFormat = "#,###,###,##0"; 
    // TODO: Use a StringBuilder
    String format = decPts==0 ? baseFormat : baseFormat + "."; 
    for (int i=0; i < decPts; i++) {
        format += "0"; 
    }

    return new DecimalFormat(format).format(d);
}

同样,这是一个坏主意,除非您需要显示任意数量的小数点,或者只能确定在运行时显示数字的方式,但情况可能并非如此。

于 2013-06-11T02:21:29.150 回答