SIunit.java

/*
 * Created on 2007/01/22
 * Copyright (C) 2007 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.control.system.parameter;

import java.util.Arrays;


/**
 * 国際単位系(SI単位系)(International System of Units)を表わす列挙型です。
 * 
 * @author koga
 * @version $Revision: 1.3 $, 2007/01/22
 */
public enum SIunit {
  /** キログラム */
  kg(1),
  /** キログラム2乗 */
  kg2(2),
  /** キログラム3乗 */
  kg3(3),
  /** キログラム */
  kg_1(-1),
  /** キログラム-2乗 */
  kg_2(-2),
  /** キログラム-3乗 */
  kg_3(-3),
  /** ニュートン */
  N(1),
  /** ニュートン2乗 */
  N2(2),
  /** ニュートン3乗 */
  N3(3),
  /** ニュートン-1乗 */
  N_1(-1),
  /** ニュートン-2乗 */
  N_2(-2),
  /** ニュートン-3乗 */
  N_3(-3),
  /** メートル */
  m(1),
  /** メートル2乗 */
  m2(2),
  /** メートル3乗 */
  m3(3),
  /** メートル-1乗 */
  m_1(-1),
  /** メートル-2乗 */
  m_2(-2),
  /** メートル-2乗 */
  m_3(-3),
  /** ラジアン */
  rad(1),
  /** ラジアン2乗 */
  rad2(2),
  /** ラジアン3乗 */
  rad3(3),
  /** ラジアン-1乗 */
  rad_1(-1),
  /** ラジアン-2乗 */
  rad_2(-2),
  /** ラジアン-3乗 */
  rad_3(-3),
  /** ヘルツ */
  Hz(1),
  /** ヘルツ2乗 */
  Hz2(2),
  /** ヘルツ3乗 */
  Hz3(3),
  /** ヘルツ-1乗 */
  Hz_1(-1),
  /** ヘルツ-2乗 */
  Hz_2(-2),
  /** ヘルツ-3乗 */
  Hz_3(-3),
  /** デシベル */
  dB(1),
  /** デシベル2乗 */
  dB2(2),
  /** デシベル3乗 */
  dB3(3),
  /** デシベル-1乗 */
  dB_1(-1),
  /** デシベル-2乗 */
  dB_2(-2),
  /** デシベル-3乗 */
  dB_3(-3),
  /** パスカル */
  Pa(1),
  /** パスカル2乗 */
  Pa2(2),
  /** パスカル3乗 */
  Pa3(3),
  /** パスカル-1乗 */
  Pa_1(-1),
  /** パスカル-2乗 */
  Pa_2(-2),
  /** パスカル-3乗 */
  Pa_3(-3),
  /** ジュール */
  J(1),
  /** ジュール2乗 */
  J2(2),
  /** ジュール3乗 */
  J3(3),
  /** ジュール-1乗 */
  J_1(-1),
  /** ジュール-2乗 */
  J_2(-2),
  /** ジュール-3乗 */
  J_3(-3),
  /** ワット */
  W(1),
  /** ワット2乗 */
  W2(2),
  /** ワット3乗 */
  W3(3),
  /** ワット-1乗 */
  W_1(-1),
  /** ワット-2乗 */
  W_2(-2),
  /** ワット-3乗 */
  W_3(-3),
  /** ケルビン */
  K(1),
  /** ケルビン2乗 */
  K2(2),
  /** ケルビン3乗 */
  K3(3),
  /** ケルビン-1乗 */
  K_1(-1),
  /** ケルビン-2乗 */
  K_2(-2),
  /** ケルビン-3乗 */
  K_3(-3),
  /** アンペア */
  A(1),
  /** アンペア2乗 */
  A2(2),
  /** アンペア3乗 */
  A3(3),
  /** アンペア-1乗 */
  A_1(-1),
  /** アンペア-2乗 */
  A_2(-2),
  /** アンペア-3乗 */
  A_3(-3),
  /** クーロン */
  C(1),
  /** クーロン2乗 */
  C2(2),
  /** クーロン3乗 */
  C3(3),
  /** クーロン-1乗 */
  C_1(-1),
  /** クーロン-2乗 */
  C_2(-2),
  /** クーロン-3乗 */
  C_3(-3),
  /** ボルト */
  V(1),
  /** ボルト2乗 */
  V2(2),
  /** ボルト3乗 */
  V3(3),
  /** ボルト-1乗 */
  V_1(-1),
  /** ボルト-2乗 */
  V_2(-2),
  /** ボルト-3乗 */
  V_3(-3),
  /** ファラッド */
  F(1),
  /** ファラッド2乗 */
  F2(2),
  /** ファラッド3乗 */
  F3(3),
  /** ファラッド-1乗 */
  F_1(-1),
  /** ファラッド-2乗 */
  F_2(-2),
  /** ファラッド-3乗 */
  F_3(-3),
  /** ヘンリー */
  H(1),
  /** ヘンリー2乗 */
  H2(2),
  /** ヘンリー3乗 */
  H3(3),
  /** ヘンリー-1乗 */
  H_1(1),
  /** ヘンリー-2乗 */
  H_2(2),
  /** ヘンリー-3乗 */
  H_3(3),
  /** テスラ */
  T(1),
  /** テスラ2乗 */
  T2(2),
  /** テスラ3乗 */
  T3(3),
  /** テスラ-1乗 */
  T_1(-1),
  /** テスラ-2乗 */
  T_2(-2),
  /** テスラ-3乗 */
  T_3(-3),
  /** ウェーバ */
  Wb(1),
  /** ウェーバ2乗 */
  Wb2(2),
  /** ウェーバ3乗 */
  Wb3(3),
  /** ウェーバ-1乗 */
  Wb_1(-1),
  /** ウェーバ-2乗 */
  Wb_2(-2),
  /** ウェーバ-3乗 */
  Wb_3(-3),
  /** オーム */
  Ohm(1),
  /** オーム2乗 */
  Ohm2(2),
  /** オーム3乗 */
  Ohm3(3),
  /** オーム-1乗 */
  Ohm_1(-1),
  /** オーム-2乗 */
  Ohm_2(-2),
  /** オーム-3乗 */
  Ohm_3(-3),
  /** シーメンス */
  S(1),
  /** シーメンス2乗 */
  S2(2),
  /** シーメンス3乗 */
  S3(3),
  /** シーメンス-1乗 */
  S_1(-1),
  /** シーメンス-2乗 */
  S_2(-2),
  /** シーメンス-3乗 */
  S_3(-3),
  /** モル */
  mol(1),
  /** モル2乗 */
  mol2(2),
  /** モル3乗 */
  mol3(3),
  /** モル-1乗 */
  mol_1(-1),
  /** モル-2乗 */
  mol_2(-2),
  /** モル-3乗 */
  mol_3(-3),
  /** カンデラ */
  cd(1),
  /** カンデラ2乗 */
  cd2(2),
  /** カンデラ3乗 */
  cd3(3),
  /** カンデラ-1乗 */
  cd_1(-1),
  /** カンデラ-2乗 */
  cd_2(-2),
  /** カンデラ-3乗 */
  cd_3(-3),
  /** ルーメン */
  lm(1),
  /** ルーメン2乗 */
  lm2(2),
  /** ルーメン3乗 */
  lm3(3),
  /** ルーメン-1乗 */
  lm_1(-1),
  /** ルーメン-2乗 */
  lm_2(-2),
  /** ルーメン-3乗 */
  lm_3(-3),
  /** ルクス */
  lx(1),
  /** ルクス2乗 */
  lx2(2),
  /** ルクス3乗 */
  lx3(3),
  /** ルクス-1乗 */
  lx_1(-1),
  /** ルクス-2乗 */
  lx_2(-2),
  /** ルクス-3乗 */
  lx_3(-3),
  /** ベクレル */
  Bq(1),
  /** ベクレル2乗 */
  Bq2(2),
  /** ベクレル3乗 */
  Bq3(3),
  /** ベクレル-1乗 */
  Bq_1(-1),
  /** ベクレル-2乗 */
  Bq_2(-2),
  /** ベクレル-3乗 */
  Bq_3(-3),
  /** グレイ */
  Gy(1),
  /** グレイ2乗 */
  Gy2(2),
  /** グレイ3乗 */
  Gy3(3),
  /** グレイ-1乗 */
  Gy_1(-1),
  /** グレイ-2乗 */
  Gy_2(-2),
  /** グレイ-3乗 */
  Gy_3(-3),
  /** シーベルト */
  Sv(1),
  /** シーベルト2乗 */
  Sv2(2),
  /** シーベルト3乗 */
  Sv3(3),
  /** シーベルト-1乗 */
  Sv_1(-1),
  /** シーベルト-2乗 */
  Sv_2(-2),
  /** シーベルト-3乗 */
  Sv_3(-3),
  /** 秒 */
  s(1),
  /** 秒2乗 */
  s2(2),
  /** 秒3乗 */
  s3(3),
  /** 秒-1乗 */
  s_1(-1),
  /** 秒-2乗 */
  s_2(-2),
  /** 秒-3乗 */
  s_3(-3),
  /** 無次元 */
  none(1),
  /** 不定 */
  undefined(1);

  /** 次数 */
  private final int degree;

  /**
   * 新しく生成された<code>UnitType</code>オブジェクトを初期化します。
   * 
   * @param degree 次数
   */
  SIunit(final int degree) {
    this.degree = degree;
  }

  /**
   * 次数を返します。
   * 
   * @return 次数
   */
  public int getDegree() {
    return this.degree;
  }

  /**
   * @see java.lang.Enum#toString()
   */
  @Override
  public String toString() {
    if (this.degree == 1) {
      return name();
    }

    String name = name();

    if (1 < Math.abs(this.degree)) {
      name = name.substring(0, name.length() - 1);
    }

    if (0 < this.degree) {
      return name + "^" + this.degree; //$NON-NLS-1$
    }

    return name.substring(0, name.indexOf('_')) + "^" + this.degree; //$NON-NLS-1$
  }

  /**
   * 単位を表わす文字列を返します。
   * 
   * @param units 単位の要素
   * @return 単位を表わす文字列
   */
  public static final String toString(final SIunit[] units) {
    final StringBuffer unitString = new StringBuffer();

    final SIunit[] sortedUnits = new SIunit[units.length];
    System.arraycopy(units, 0, sortedUnits, 0, units.length);
    Arrays.sort(sortedUnits);

    // 次数が正の単位
    for (SIunit unit : sortedUnits) {
      if (unit.degree <= 0) {
        continue;
      }

      if (0 < unitString.length()) {
        unitString.append("."); //$NON-NLS-1$
      }
      unitString.append(unit.toString());
    }

    // 次数が負の単位
    for (SIunit unit : sortedUnits) {
      if (unit.degree >= 0) {
        continue;
      }

      if (0 < unitString.length()) {
        unitString.append("."); //$NON-NLS-1$
      }
      unitString.append(unit.toString());
    }

    return unitString.toString();
  }

  /**
   * 2個の単位が等しいか判定します。
   * 
   * @param units1 比較対象の単位1
   * @param units2 比較対象の単位2
   * @return 2個の単位が等しければtrue、そうでなければfalse
   */
  public static final boolean equals(final SIunit[] units1, final SIunit[] units2) {
    if (units1 == null && units2 == null) {
      return true;
    }
    if (units1 == null || units2 == null) {
      return false;
    }
    if (units1.length != units2.length) {
      return false;
    }

    for (int i = 0; i < units1.length; i++) {
      if (units1[i].equals(units2[i]) == false) {
        return false;
      }
    }

    return true;
  }

}