Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2019-12-08

尺貫法⇔メートル法の単位変換を実際に即して行いたい!

| 19:04

 マイナビ連載49目は、時給計算ツールを作ろう!でした。

https://news.mynavi.jp/article/nadeshiko-49/

 時の計算ってめんどくさいですよね~。

 なでしこ1の日付時計算命令は、とても便利で良い物でした。

 v3には実装されていないので、前に同じように使える関数を作ってみたりしたよね。

https://nadesiko.g.hatena.ne.jp/snowdrops89/20170824/1503579885


 めんどくさいと言えば、単位の変換もそうですよねー?

 して、例えば「1km」を「9.1667町」とか「550」とかに変換してくれるサイトは沢山あるんですけれどね。

 そうじゃない

 こはやはり、実際に即して、9町10となって欲しい。

 コレが、尺、寸だったら10進法だから165cm→5.445尺となっても、あー、5尺4寸4分5厘ですかねとゆうことになるんだけど、里、町、だとそうはいないワケですよ。1里は36町で、1町は60なんですよね。めんどくさい(´д`)

 というわけで、こんなの。

#-----------------------------------------------------------------------
# 単位変換 尺貫法←→メートル法
#-----------------------------------------------------------------------
変換データ=「"長さ","尺貫法","丈,尺,寸,分,厘","10,1,0.1,0.01,0.001","{1/3.3}","(じょう)=10尺=3.0303m,(しゃく)=10寸=30.303cm,(すん)=10分=3.0303cm,(ぶ)=10厘=3.0303mm,(りん)=0.30303mm"
"長さ","メートル法","m,cm,mm","1,0.01,0.001","3.3"," (メートル)=100cm=3.3尺, (センチメートル)=10mm=3.3分, (ミリメートル)=3.3厘"
"距離","尺貫法","里,町,,尺","12960,360,6,1","{1/3.3}","(り)=36町=3.9273km,(ちょう)=60=109.09m,(けん)=6尺=1.8182m,(しゃく)=30.303cm"
"距離","メートル法","km,m","1000,1","3.3"," (キロメートル)=1000m=9町10, (メートル)=3.3尺"
"体","尺貫法","石,斗,升,合,勺","100,10,1,0.1,0.01","{2401/1331}","(こく)=10斗=180.39L,(と)=10升=18.039L,(しょう)=10合=1.8039L,(ごう)=10勺=180.39cc,(しゃく)=18.039cc"
"体","メートル法","L,cc","1,0.001","{1331/2401}"," (リットル)=1000cc=0.55435升, (シーシー)=0.05543勺"
"面","尺貫法","町,反,畝,坪","3000,300,30,1","{1/0.3025}","(ちょう)=10反=9917.4m<sup>2</sup>=約1ha,(たん)=10畝=991.74m<sup>2</sup>=約1a,(せ)=30坪=99.174m<sup>2</sup>,(つぼ)=3.3058m<sup>2</sup>"
"面","メートル法","ha,a,m<sup>2</sup>","10000,100,1","0.3025","(ヘクタール)=10000m<sup>2</sup>=約1町,(アール)=100m<sup>2</sup>=約1反,(平方メートル)=0.3025坪"
"重さ","尺貫法","貫,斤,両,匁","1000,160,10,1","3.75","(かん)=1000匁=3.75kg,(きん)=160匁=600g,(りょう)=10匁=37.5g,(もんめ)=3.75g"
"重さ","メートル法","kg,g","1000,1","{1/3.75}"," (キログラム)=1000g=266.67匁, (グラム)=0.26667匁"」
変換データ=変換データをCSV取得。

#---宣言----------
変換元単位=。変換元単位相関=。変換元単位説明=。
変換先単位=。変換先単位相関=。変換定義=。
変換先A=配列。変換先B=配列。
桁=8。

#---HTML設定----------
HTML=「
  <div id="select"></div>
  <p><div id="setumei"></div></p>
  <p><div id="gui"></div></p>
  <p><div id="result"></div></p>」
「#nako3_div_1」にHTMLHTML設定。

#---CSS設定----------
「#setumei」に{
  "margin": "20px",
}をDOMスタイル一括設定。

「#gui」に{
  "width": "380px",
  "margin": "20px",
}をDOMスタイル一括設定。

「#result」に{
  "border": "3px double",
  "margin": "5px",
  "padding": "10px",
  "文字サイズ": "20px",
  "背景色": アリスブルー色
}をDOMスタイル一括設定。

#---セレクトボックス作成----------
項目=配列
数=0。
変換データを反復
  換算項目=対象[0]。変換元=対象[1]。
  もし、数%2=0ならば、変換先=「メートル法」
  違えば、変換先=「尺貫法」
  項目[数]=「{換算項目} {変換元}→{変換先}」。
  数=数+1。
ここまで。

「#select」にDOM親要素設定。
項目のセレクトボックス作成し、項目セレクトに代入。
項目セレクトの「onchange」に「フィールド作成」をDOMイベント設定。
#-----------------------------------------------------------
フィールド作成。

●フィールド作成
  v=項目セレクトの「value」をDOM属性取得。
  No=項目からvを配列検索。
  変換元=変換データ[No]。
  もし、No%2=0ならば、変換先=変換データ[No+1]。
  違えば、変換先=変換データ[No-1]

  タイトル=「{変換元[0]}の単位変換 {変換元[1]}→{変換先[1]}」
  説明=「{変換元[1]}の{変換元[0]}の単位を、{変換先[1]}に変換します。」

  #---データ----------
  変換元単位=変換元[2]を「,」で区切る。
  変換元単位相関=変換元[3]を「,」で区切る。
  変換元単位説明=変換元[5]を「,」で区切る。
  変換先単位=変換先[2]を「,」で区切る。
  変換先単位相関=変換先[3]を「,」で区切る。
  変換定義=変換元[4]。
  変換先A=配列。変換先B=配列。

  #---項目設定----------
  resultクリア。
  説明=説明の改行を「<BR>」に置換。
  「#setumei」に説明をテキスト設定。

  #---GUI作成----------
  変換元エディタ。
  (変換元単位の要素数)
    変換元エディタ=変換元エディタに「<input type="text" id="edit{回数-1}" value="0" maxlength="{桁+2}" onclick="this.select();"  pattern="^[0-9]+$">
        <span>{変換元単位[回数-1]}{変換元単位説明[回数-1]}</span><BR>」を一行追加。
  ここまで。
  変換元エディタを「#gui」にHTML設定。
  (変換元単位の要素数)
    「#edit{回数-1}」に{
      "幅": "65px",
      "高さ": "20px",
      "margin": "5px",
      "text-align": "right",
      "padding":"0px 5px",
      "ime-mode":"disabled"
    }をDOMスタイル一括設定。
  ここまで。

  「#gui」にDOM親要素設定。
  「変換」のボタン作成して、変換ボタン代入。
  「クリア」のボタン作成して、クリアボタン代入。
  変換ボタンに{"幅": "60px","margin": "5px"}をDOMスタイル一括設定。
  クリアボタンに{"幅": "60px","margin": "5px"}をDOMスタイル一括設定。

  #---イベント設定----------
  クリアボタンをクリックした時には、
   (変換元単位の要素数)
     「#edit{回数-1}」に0をテキスト設定。
   ここまで。
   resultクリア。
  ここまで。

  変換ボタンをクリックした時には
   #---変換元を一つにまとめる----------
   変換元=0。
   (変換元単位の要素数)
     仮=「#edit{回数-1}」のテキスト取得。
     もし、(仮が数列判定)=いいえならば、
       仮=0。「#edit{回数-1}」に0をテキスト設定。
     ここまで。
     仮=仮*(変換元単位相関[回数-1])。
     変換元=変換元+仮。
   ここまで

   #---変換先A(実際に即した換算)作成----------
   基本=変換元*変換定義。  #基本となるデータ
   (変換先単位の要素数)
     基本=基本を桁で小数点四捨五入。
     もし回数=1ならば、基本=基本*(1/変換先単位相関[回数-1])
     違えば、基本=(基本-変換先A[回数-2])*(1/(変換先単位相関[回数-1]/変換先単位相関[回数-2]))
     もし回数=(変換先単位の要素数)ならば、変換先A[回数-1]=基本を2で小数点切捨。
     違えば、変換先A[回数-1]=基本を切り捨て。
   ここまで。

   #---変換先B(各単位毎単独で換算)作成----------
   基本=変換元*変換定義。  #基本となるデータ。
   (変換先単位の要素数)
     変換先B[回数-1]=(基本/変換先単位相関[回数-1])を桁で桁揃え。
   ここまで。

   #---HTML設定----------
   A=。B=。
   (変換先単位の要素数)
     A=A&「{変換先A[回数-1]}{変換先単位[回数-1]} 」
     B=B&「{変換先B[回数-1]}{変換先単位[回数-1]}<BR>」
   ここまで。
   変換内容=A&「<BR><BR>」&B。
   「#result」に変換内容をHTML設定。
  ここまで。
ここまで。

●resultクリア
 A=。B=。
 (変換先単位の要素数)
  A=A&「0{変換先単位[回数-1]} 」
  B=B&「0{変換先単位[回数-1]}<BR>」
 ここまで。
 変換内容=A&「<BR><BR>」&B。
 「#result」に変換内容をテキスト設定。
ここまで。
#-----------------------------------------------
●(数を桁で)桁揃え
 整数桁=(数の整数部分文字列変換)の文字数。
 もし整数桁≧桁ならば、数の整数部分戻る。
 違えば、数を(桁-整数桁)で小数点四捨五入して戻るここまで。

●(数をAで)小数点四捨五入
  数=数*(10^A)
  数=数を四捨五入。
  数=数/(10^A)
  数で戻る
ここまで。

●(数をAで)小数点切捨
  数=数*(10^A)
  数=数を切捨。
  数=数/(10^A)
  数で戻る
ここまで。

●(数の)整数部分
  数のINTここまで。

●(数の)小数部分
  数のFRACここまで。
#-----------------------------------------------------------------------

http://snowdrops.starfree.jp/nako3/kanzan_1_10.html

 どうかな? うまくいってると思うんだけど・・・

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20191208