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