我有一个要求取决于地图的特定键值,我需要格式化输出。
例如,如果其值大于1,则需要在值之后仅显示2个小数点 (12.23)或者如果它的值小于1,我需要在它之后显示4个小数点。
我编写的代码工作正常,但我正在寻找一种更好的方法(基本上我不喜欢我的代码中的其他条件)
这是我的程序,取决于我格式化输出的最后一个属性键值
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);
}
}
答案 0 :(得分:5)
如果您愿意,可以创建Map<Integer, DecimalFormat> formats
(或List<DecimalFormat>
。然后formatNumber()
只需调用formats.get(decPts)
即可获得正确的格式。
答案 1 :(得分:1)
您可以使用switch
句子
switch (decPts) {
case 0:
return new DecimalFormat("#,###,###,##0").format(d);
case 2:
...
}
它有助于整理此案例的代码。无论如何,如果不使用ìf
或类似结构,您将无法使用任何语言进行编程。
答案 2 :(得分:1)
您在formatNumber
方法中实现的逻辑是switch语句的理想选择。尝试
switch (decPts) {
case 0:
return new DecimalFormat("#,###,###,##0").format(d);
break;
case 2:
return new DecimalFormat("#,###,###,##0.00").format(d);
break;
...
}
有关详细信息,请参阅this tutorial。
编辑:虽然SJuan76击败了我,但我更喜欢Code-Guru的想法!
答案 3 :(得分: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的情况。
答案 4 :(得分: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);
}
答案 5 :(得分: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);
}
答案 6 :(得分: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);
}
同样,这是一个坏主意,除非您需要显示任意数量的小数点或者只能确定在运行时显示数字的方式,这可能不是这种情况。