度量衡計算を行うには? (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