在解析输入字符串时保留输入字符串的格式为double

时间:2013-01-11 07:16:09

标签: java


我有一个从csv文件为表提供值的方案。

在那里,有些列有双重值。

捕捉是双重值可以是任何双重格式,即 81或81.0或8.1E1。

我只想在解析字符串后保留双重格式。

示例 如果字符串是81.0,那么格式模式应该是##。#并且双解析应该是81.0而不是81或81.00
如果string是12.12,那么格式模式应该是##。##与上面相同。

提前致谢。

3 个答案:

答案 0 :(得分:1)

你需要你自己的价值持有人类:

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。对于像德语这样的语言,您可以在解析格式之前替换小数点和分组分隔符。

答案 1 :(得分:0)

我认为Double.valueOf涵盖了您的使用案例。

此外,81.0 == 8181.00 == 81.0以及81 == 81.00都会返回true,这意味着如果您解析81.00,它将以{{1}的形式存储在Java双精度中,没有改变。

答案 2 :(得分:0)

如果您尝试将double转换为string,则无法保留每个double值的格式值。

因为double值存储在二进制中。

跟踪十进制零的想法,如106.4000,在double值中没有意义。