我有一个从 csv 文件向表提供值的场景。
在那里,一些列具有双值。
关键是双精度值可以是任何双精度格式,即 81 或 81.0 或 8.1E1。
我只想在将字符串解析为双精度后保留双格式。
例如,如果字符串为 81.0,则格式模式应为 ##.#,双解析应为 81.0 而不是 81 或 81.00
,如果字符串为 12.12,则格式模式应为 ##.## 与上述相同。
提前致谢。
我有一个从 csv 文件向表提供值的场景。
在那里,一些列具有双值。
关键是双精度值可以是任何双精度格式,即 81 或 81.0 或 8.1E1。
我只想在将字符串解析为双精度后保留双格式。
例如,如果字符串为 81.0,则格式模式应为 ##.#,双解析应为 81.0 而不是 81 或 81.00
,如果字符串为 12.12,则格式模式应为 ##.## 与上述相同。
提前致谢。
您需要自己的价值持有者类,如下所示:
public class Value<Raw> {
private final Format format;
private Raw value;
private String display;
public Value(String display, Format format) {
this.format = format;
this.display = display;
value = format.parseObject(display);
}
public String getDisplay() {
return display;
}
public Raw getValue() {
return value;
}
public void setValue(Raw value) {
this.value = value;
display = format.format(value);
}
public void setDisplay(String display) {
this.display = display;
value = format.parseObject(display);
}
public int hashCode() {
return value == null ? 0 : value.hashCode();
}
public boolean equals(Object other) {
if (other == null || Value.class != other.getCLass()) {
return false;
}
Object otherValue = ((Value)other).value;
return value == null ? otherRaw == null : value.equals(otherValue);
}
public String toString() {
return display;
}
}
最后是确定格式。根据语言环境和文件格式,这有点棘手。对于 DecimalFormat,您可以将所有数字替换为 # 并将前导 # 减少为 1。对于像德语这样的语言,您可以在解析格式之前替换小数点和分组分隔符。
如果您尝试转换double
为string
,则没有机会保留每个值的格式double
值。
因为double
值以二进制形式存储。
尾随十进制零的想法,如 106.4000,在double
值中是没有意义的。
我认为Double.valueOf
涵盖了您的用例。
此外,81.0 == 81
and 81.00 == 81.0
and81 == 81.00
都将返回 true,这意味着如果您 parsed 81.00
,它将存储在 Java double as 中81
,不会改变这一点。