0


csvファイルからテーブルに値を提供するシナリオがあります。

そこでは、いくつかの列に二重の値があります。

キャッチは、double値が任意のdouble形式、つまり81、81.0、または8.1E1のいずれかである可能性があることです。

文字列をdoubleに解析した後、doubleフォーマットを保持したいだけです。

たとえば、文字列が81.0の場合、フォーマットパターンは##。#であり、二重解析は81.0であり、81または81.00ではありません
。文字列が12.12の場合、フォーマットパターンは上記と同じ##。##である必要があります。

前もって感謝します。

4

3 に答える 3

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 に減らすことができます。ドイツ語のような言語の場合、フォーマットを解析する前に小数点とグループ区切り記号を置き換える必要があります。

于 2013-01-11T07:59:15.467 に答える
0

に変換しようとするdoublestring、各値のフォーマット値を保持する機会がありませんdouble

double値はバイナリで格納されるためです。

106.4000 のように、末尾に 10 進数のゼロを付けるという考えは、double値としては無意味です。

于 2013-01-11T07:45:22.857 に答える
0

Double.valueOfあなたのユースケースをカバーしていると思います。

さらに、81.0 == 81and81.00 == 81.081 == 81.00はすべて true を返します。つまり、 を解析した場合81.00、それは Java の double として に格納され、それを81変更する必要はありません。

于 2013-01-11T07:21:45.493 に答える