Java 将输入字符串解析为双精度时保留其格式
Java 将输入字符串解析为双精度时保留其格式,java,Java,我有一个从csv文件向表提供值的场景 在这里,有些列具有双值 问题是,双精度值可以是任何双精度格式,即 81或81.0或8.1E1 我只想在将字符串解析为double后保留double格式 范例 如果字符串为81.0,则格式模式应为###.#,双解析应为81.0,而不是81或81.00 如果字符串为12.12,则格式模式应与上面相同。 提前感谢。我想这涵盖了您的用例 此外,81.0==81和81.00==81.0和81==81.00都将返回true,这意味着如果您解析81.00,它将存储在Jav
我有一个从csv文件向表提供值的场景 在这里,有些列具有双值 问题是,双精度值可以是任何双精度格式,即 81或81.0或8.1E1 我只想在将字符串解析为double后保留double格式 范例 如果字符串为81.0,则格式模式应为###.#,双解析应为81.0,而不是81或81.00
如果字符串为12.12,则格式模式应与上面相同。
提前感谢。我想这涵盖了您的用例
此外,
81.0==81
和81.00==81.0
和81==81.00
都将返回true,这意味着如果您解析81.00
,它将存储在Java双精度中,作为81
,这一点没有改变。如果您尝试将double
转换为字符串
,没有机会保留每个双精度值的格式值
因为double
值是以二进制形式存储的
在106.4000中,尾随十进制零的概念在双精度值中毫无意义。您需要自己的值持有者类,如下所示:
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;
}
}
公共类值{
私人最终格式;
私人原始价值;
私有字符串显示;
公共值(字符串显示,格式){
this.format=格式;
this.display=显示;
值=format.parseObject(显示);
}
公共字符串getDisplay(){
返回显示;
}
公共原始getValue(){
返回值;
}
公共无效设置值(原始值){
这个值=值;
显示=格式。格式(值);
}
公共void setDisplay(字符串显示){
this.display=显示;
值=format.parseObject(显示);
}
公共int hashCode(){
返回值==null?0:value.hashCode();
}
公共布尔等于(对象其他){
if(other==null | | Value.class!=other.getCLass()){
返回false;
}
对象其他值=((值)其他).Value;
返回值==null?其他原始值==null:value.equals(其他值);
}
公共字符串toString(){
返回显示;
}
}
最后是确定格式。根据区域设置和文件格式,这有点棘手。对于十进制格式,您可以将所有数字替换为#,并将前导减少为一。对于德语等语言,在解析格式之前,您有替换小数点和分组分隔符的选项。此外,如果您想保留模式供以后使用,您可能需要查看正则表达式以将模式的实例转换为原始模式。如果要保留格式,请保留原始字符串。在一般情况下,您可以使用特定于语言环境的格式,例如1.234,00