度量衡計算を行うには? (Delphi 6 以降)

 ConvUtils.Convert() を使います。

uses
  ..., ConvUtils, StdConvs;

var
  Value: Double;
begin
  // 1cm -> メートル
  Value := Convert(1, duCentimeters, duMeters);
  ShowMessage(FloatToStr(Value));
end;

 こんな感じです。では "坪" を "平米" で計算して...あれ?

「尺貫法ディスってんスかー(怒)」

 ディスられている尺貫法を使うには以下の 2 つのユニットを使います。

unit JpConvs;

interface

uses
  SysUtils, ConvUtils;

var
  { ************************************************************************* }
  { Distance Conversion Units }
  { basic unit of measurement is meters }
  duShaku: TConvType;
  duSun: TConvType;
  duJyou: TConvType;
  duKen: TConvType;
  duHiro: TConvType;
  duChou: TConvType;
  duLi: TConvType;
  duMon: TConvType;

  { ************************************************************************* }
  { Area Conversion Units }
  { basic unit of measurement is square meters }
  auTsubo: TConvType;
  auBu: TConvType;
  auGou: TConvType;
  auShaku: TConvType;
  auSe: TConvType;
  auTan: TConvType;
  auDan: TConvType;
  auChou: TConvType;

  { ************************************************************************* }
  { Volume Conversion Units }
  { basic unit of measurement is cubic meters }
  vuShou: TConvType;
  vuGou: TConvType;
  vuShaku: TConvType;
  vuTo: TConvType;
  vuKoku: TConvType;

  { ************************************************************************* }
  { Mass Conversion Units }
  { basic unit of measurement is grams }
  muKan: TConvType;
  muRyou: TConvType;
  muMomme: TConvType;
  muKin: TConvType;

{ Constants (and their derivatives) used in this unit }
const
  MetersPerShaku = 10 / 33;
  MetersPerSun = MetersPerShaku / 10;
  MetersPerJyou = MetersPerShaku * 10;
  MetersPerKen = MetersPerShaku * 6;
  MetersPerHiro = MetersPerKen;
  MetersPerChou = MetersPerKen * 60;
  MetersPerLi = MetersPerChou * 36;
  MetersPerMon = 0.024;

  SquareMetersPerTsubo = 400 / 121;
  SquareMetersPerBu = SquareMetersPerTsubo;
  SquareMetersPerGou = SquareMetersPerBu / 10;
  SquareMetersPerShaku = SquareMetersPerGou / 10;
  SquareMetersPerSe = SquareMetersPerTsubo * 30;
  SquareMetersPerTan = SquareMetersPerSe * 10;
  SquareMetersPerDan = SquareMetersPerTan;
  SquareMetersPerChou = SquareMetersPerTan * 10;

  CubicMetersPerShou = 2401 / 1331 / 1000;
  CubicMetersPerGou = CubicMetersPerShou / 10;
  CubicMetersPerShaku = CubicMetersPerGou / 10;
  CubicMetersPerTo = CubicMetersPerShou * 10;
  CubicMetersPerKoku = CubicMetersPerTo * 10;

  GramsPerKan = 15 / 4 * 1000;
  GramsPerRyou = GramsPerKan / 100;
  GramsPerMomme = GramsPerRyou / 10;
  GramsPerKin = GramsPerRyou * 16;

implementation

uses
  StdConvs, JPConvsConsts, DateUtils;

initialization

  { ************************************************************************* }
  { Distance's family type }
  duShaku := RegisterConversionType(cbDistance, SShakuDescription, MetersPerShaku);
  duSun := RegisterConversionType(cbDistance, SSunDescription, MetersPerSun);
  duJyou := RegisterConversionType(cbDistance, SJyouDescription, MetersPerJyou);
  duKen := RegisterConversionType(cbDistance, SKenDescription, MetersPerKen);
  duHiro := RegisterConversionType(cbDistance, SHiroDescription, MetersPerHiro);
  duChou := RegisterConversionType(cbDistance, SChouDescription, MetersPerChou);
  duLi := RegisterConversionType(cbDistance, SLiDescription, MetersPerLi);
  duMon := RegisterConversionType(cbDistance, SMonDescription, MetersPerMOn);

  { ************************************************************************* }
  { Area's family type }
  auTsubo := RegisterConversionType(cbArea, SShakuDescription, SquareMetersPerTsubo);
  auBu := RegisterConversionType(cbArea, SBuDescription, SquareMetersPerBu);
  auGou := RegisterConversionType(cbArea, SGouDescription, SquareMetersPerGou);
  auShaku := RegisterConversionType(cbArea, SShaku2Description, SquareMetersPerShaku);
  auSe := RegisterConversionType(cbArea, SSeDescription, SquareMetersPerSe);
  auTan := RegisterConversionType(cbArea, STanDescription, SquareMetersPerTan);
  auDan := RegisterConversionType(cbArea, SDanDescription, SquareMetersPerDan);
  auChou := RegisterConversionType(cbArea, SChou2Description, SquareMetersPerChou);

  { ************************************************************************* }
  { Volume Conversion Units }
  vuShou := RegisterConversionType(cbVolume, SShouDescription, CubicMetersPerShou);
  vuGou := RegisterConversionType(cbVolume, SGou2Description, CubicMetersPerGou);
  vuShaku := RegisterConversionType(cbVolume, SShaku3Description, CubicMetersPerShaku);
  vuTo := RegisterConversionType(cbVolume, SToDescription, CubicMetersPerTo);
  vuKoku := RegisterConversionType(cbVolume, SKokuDescription, CubicMetersPerKoku);

  { ************************************************************************* }
  { Mass's family type }
  muKan := RegisterConversionType(cbMass, SKanDescription, GramsPerKan);
  muRyou := RegisterConversionType(cbMass, SRyouDescription, GramsPerRyou);
  muMomme := RegisterConversionType(cbMass, SMommeDescription, GramsPerMomme);
  muKin := RegisterConversionType(cbMass, SKinDescription, GramsPerKin);

end.

unit JPConvsConsts;

interface

resourcestring
  { ************************************************************************* }
  { Distance's various conversion types }
  SShakuDescription = '尺';
  SSunDescription = '寸';
  SJyouDescription = '丈';
  SKenDescription = '間';
  SHiroDescription = '尋(日本)'; // not Fathom
  SChouDescription = '町';
  SLiDescription = '里(日本)';
  SMonDescription = '文';

  { ************************************************************************* }
  { Area's various conversion types }
  STsuboDescription = '坪';
  SBuDescription = '歩';
  SGouDescription = '合';
  SShaku2Description = '勺';
  SSeDescription = '畝';
  STanDescription = '反';
  SDanDescription = '段';
  SChou2Description = '町';

  { ************************************************************************* }
  { Volume's various conversion types }
  SShouDescription = '升';
  SGou2Description = '合';
  SShaku3Description = '勺';
  SToDescription = '斗';
  SKokuDescription = '石';

  { ************************************************************************* }
  { Mass's various conversion types }
  SKanDescription = '貫';
  SRyouDescription = '両';
  SMommeDescription = '匁';
  SKinDescription = '斤';

implementation

end.

 JPConvsConsts.pas は場合によっては訳して使う事になるので、Delphi 2005 以降ではなるべく UTF-8 で保存して下さい。

 え? 「匁 (もんめ) の綴りが "Momme" になってるぞ」 ですって?

「世界基準単位の "Momme" ナメてんスかー(怒)」

 "匁" は世界的な単位 なのですヨ...ま、それはともかく使い方です。

uses
  ..., ConvUtils, StdConvs, JpConvs;

var
  Value: Double;
begin
  // 一升 -> リットル
  Value := Convert(1, vuShou, vuLiters);
  ShowMessage(FloatToStr(Value));
end;

 JpConvs を uses するだけですね。特定の業界筋でしか使わないような単位はお好きに追加して下さい..."ガラス坪" とか。

 ConvUtils.Convert() の第 2、第 3 引数に利用できる StdConvs.pas / JpConvs.pas で定義されている TConvType 型の変数を調べるのは意外に面倒なので、単位と TConvType 型の変数一覧を以下に掲載しておきます。

 言うまでもない事かも知れませんが、度量衡の計算は同じカテゴリの単位同士でしか行えません。


長さ / 距離の単位

単位TConvType 型変数
マイクロメートルduMicromicrons
オングストロームduAngstroms
ミリミクロンduMillimicrons
ミクロンduMicrons
ミリメートルduMillimeters
センチメートルduCentimeters
デシメートルduDecimeters
メートルduMeters
デカメートルduDecameters
ヘクトメートルduHectometers
キロメートルduKilometers
メガメートルduMegameters
ギガメートルduGigameters
インチduInches
フィートduFeet
ヤードduYards
マイルduMiles
海里duNauticalMiles
天文単位duAstronomicalUnits
光年duLightYears
パーセクduParsecs
キュービットduCubits
ファゾム※duFathoms
ファーロングduFurlongs
ハンドduHands
ペースduPaces
ロッドduRods
チェーンduChains
リンクduLinks
パイカduPicas
ポイントduPoints
尺duShaku
寸duSun
丈duJyou
間duKen
尋(日本)duHiro
町duChou
里(日本)duLi
文duMon

 ※duFathoms は RTLConsts.pas 内の単位の説明では "尋" となっていますが、"ファゾム" と "尋" は違います (但しどちらも両手を広げた長さがルーツです)。この問題は XE2 で修正されています。


広さ / 面積の単位

単位TConvType 型変数
平方ミリメートルauSquareMillimeters
平方センチメートルauSquareCentimeters
平方デシメートルauSquareDecimeters
平方メートルauSquareMeters
平方デカメートルauSquareDecameters
平方ヘクトメートルauSquareHectometers
平方キロメートルauSquareKilometers
平方インチauSquareInches
平方フィートauSquareFeet
平方ヤードauSquareYards
平方マイルauSquareMiles
エーカーauAcres
センタールauCentares
アールauAres
ヘクタールauHectares
平方ロッドauSquareRods
坪auTsubo
歩auBu
合auGou
勺auShaku
畝auSe
反auTan
段auDan
町auChou

体積の単位

単位TConvType 型変数
立方ミリメートルvuCubicMillimeters
立方センチvuCubicCentimeters
立方デシメートルvuCubicDecimeters
立方メートルvuCubicMeters
立方デカメートルvuCubicDecameters
立方ヘクトメートルvuCubicHectometers
立方キロメートルvuCubicKilometers
立方インチvuCubicInches
立方フィートvuCubicFeet
立方ヤードvuCubicYards
立方マイルvuCubicMiles
ミリリットルvuMilliLiters
センチリットルvuCentiLiters
デシリットルvuDeciLiters
リットルvuLiters
デカリットルvuDecaLiters
ヘクトリットルvuHectoLiters
キロリットルvuKiloLiters
エーカーフィートvuAcreFeet
エーカーインチvuAcreInches
コードvuCords
コードフィートvuCordFeet
デシステールvuDecisteres
ステールvuSteres
デカステールvuDecasteres
液量ガロンvuFluidGallons
液量クオートvuFluidQuarts
液量パイントvuFluidPints
液量カップvuFluidCups
液量ジルvuFluidGills
液量オンスvuFluidOunces
液量大さじvuFluidTablespoons
液量小さじvuFluidTeaspoons
乾量ガロンvuDryGallons
乾量クオートvuDryQuarts
乾量パイントvuDryPints
乾量ペックvuDryPecks
乾量バケットvuDryBuckets
乾量ブッシェルvuDryBushels
ガロン(英)vuUKGallons
ポトル(英)vuUKPottles
クオート(英)vuUKQuarts
パイント(英)vuUKPints
ジル(英)vuUKGills
オンス(英)vuUKOunces
ペック(英)vuUKPecks
バケット(英)vuUKBuckets
ブッシェル(英)vuUKBushels
升vuShou
合vuGou
勺vuShaku
斗vuTo
石vuKoku

重さ / 質量の単位

単位TConvType 型変数
ナノグラムmuNanograms
マイクログラムmuMicrograms
ミリグラムmuMilligrams
センチグラムmuCentigrams
デシグラムmuDecigrams
グラムmuGrams
デカグラムmuDecagrams
ヘクトグラムmuHectograms
キログラムmuKilograms
メートルトンmuMetricTons
ドラムmuDrams
グレインmuGrains
トンmuTons
英トンmuLongTons
オンズmuOunces
ポンドmuPounds
ストーンmuStones
貫muKan
両muRyou
匁muMomme
斤muKin

温度の単位

単位TConvType 型変数
摂氏 / セルシウスtuCelsius
ケルビンtuKelvin
華氏 / ファーレンハイトtuFahrenheit
蘭氏 / ランキンtuRankine
列氏 / レオミュールtuReaumur

時間の単位

単位TConvType 型変数
ミリ秒tuMilliSeconds
秒tuSeconds
分tuMinutes
時間tuHours
日tuDays
週tuWeeks
二週間tuFortnights
月tuMonths
年tuYears
デケード※ / 10 年tuDecades
世紀tuCenturies
千年紀tuMillennia
日付時刻tuDateTime
ユリウス日tuJulianDate
準ユリウス日tuModifiedJulianDate

 ※某特撮ヒーロ的には "ディケイド" です。


 BACK