「数値を増減」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Masme (トーク | 投稿記録)
更新履歴の書式を調整
Masme (トーク | 投稿記録)
マクロ更新。例示を<code>→<samp>に変更
1行目: 1行目:
__NOTOC__
<div style="float:right">__TOC__</div>
 
カーソル付近or選択範囲に半角数字列があれば 1 増やし/減らします。
カーソル付近or選択範囲に半角数字列があれば 1 増やし/減らします。


* カーソル位置は、数字の左端・中間・右端どこでもかまいません。<br>範囲選択時は、範囲内の数字列が対象となります。<br><span style="color:#c00;">※マクロの仕様上、矩形選択には対応していません。</span>
* カーソル位置は、数字の左端・中間・右端どこでもかまいません。<br>範囲選択時は、範囲内のみが対象となります。<br><b style="color:#c00;">※マクロの仕様上、矩形選択には対応していません。</b>
:{|class="wikitable" style="text-align:center;"
:{|class="wikitable" style="text-align:center;"
!  !! 左端 !! colspan="2"|中間 !! 右端 !! 範囲選択時
!  !! 左端 !!colspan="2"|中間 !! 右端 !! 範囲選択時
|-
|-
! 元値
! 元値
|<code><span style="border-right:2px solid;"></span>999</code>
|<samp><span style="border-right:2px solid;"></span>999</samp>
|<code>9<span style="border-right:2px solid;"></span>99</code>
|<samp>9<span style="border-right:2px solid;"></span>99</samp>
|<code>99<span style="border-right:2px solid;"></span>9</code>
|<samp>99<span style="border-right:2px solid;"></span>9</samp>
|<code>999<span style="border-right:2px solid;"></span></code>
|<samp>999<span style="border-right:2px solid;"></span></samp>
|<code>9<span style="border-right:2px solid; background:#bfdfff;">99,99</span>9</code>
|<samp>9<span style="border-right:2px solid; background:#bfdfff;">99,99</span>9</samp>
|-
|-
! 増やす
! 増やす
|<code><span style="border-right:2px solid;"></span>1000</code>
|<samp><span style="border-right:2px solid;"></span>1000</samp>
|<code>10<span style="border-right:2px solid;"></span>00</code>
|<samp>10<span style="border-right:2px solid;"></span>00</samp>
|<code>100<span style="border-right:2px solid;"></span>0</code>
|<samp>100<span style="border-right:2px solid;"></span>0</samp>
|<code>1000<span style="border-right:2px solid;"></span></code>
|<samp>1000<span style="border-right:2px solid;"></span></samp>
|<code>9<span style="border-right:2px solid; background:#bfdfff;">100,100</span>9</code>
|<samp>9<span style="border-right:2px solid; background:#bfdfff;">100,100</span>9</samp>
|}
|}
* 先頭の 0 埋め (ゼロパディング/ゼロサプライ) は考慮されます。<br>負数 (-1)/小数 (0.1)/指数 (1.2e3) などは考慮されません。
* 0 埋め (ゼロパディング/ゼロフィル) された数値は桁数を維持して増減します。
* 負数 (-1)/小数 (0.1)/指数 (1.2e3) などには対応していません。
:{|class="wikitable" style="text-align:center;"
:{|class="wikitable" style="text-align:center;"
! ゼロなし !! ゼロあり !! ※負数 !! ※負数 !! ※小数 !! ※指数
!colspan="2"|ゼロなし/あり !!colspan="2"|負数の例 !! 小数の例 !! 指数の例
|-
|-
|<code>99</code>
|<samp>99</samp>
|<code><b style="color:#c00;">00</b>99</code>
|<samp><b style="color:#c00;">00</b>99</samp>
|<code><span style="border-left:2px solid;"></span>-1</code>
|<samp><span style="border-left:2px solid;"></span>-1</samp>
|<code>-<b style="color:#c00;">0</b><span style="border-left:2px solid;"></span></code>
|<samp>-<b style="color:#c00;">0</b><span style="border-left:2px solid;"></span></samp>
|<code>0.<span style="border-left:2px solid;"></span><b style="color:#c00;">9</b></code>
|<samp>0.<span style="border-left:2px solid;"></span><b style="color:#c00;">9</b></samp>
|<code><span style="border-left:2px solid; background:#bfdfff;">9.8e1</span></code>
|<samp><span style="border-left:2px solid; background:#bfdfff;">9.8e1</span></samp>
|-
|-
|<code>100</code>
|<samp>100</samp>
|<code><b style="color:#c00;">0</b>100</code>
|<samp><b style="color:#c00;">0</b>100</samp>
|<code><span style="border-left:2px solid;"></span>-1</code>
|<samp><span style="border-left:2px solid;"></span>-1</samp>
|<code>-<b style="color:#c00;">1</b><span style="border-left:2px solid;"></span></code>
|<samp>-<b style="color:#c00;">1</b><span style="border-left:2px solid;"></span></samp>
|<code>0.<span style="border-left:2px solid;"></span><b style="color:#c00;">10</b></code>
|<samp>0.<span style="border-left:2px solid;"></span><b style="color:#c00;">10</b></samp>
|<code><span style="border-left:2px solid; background:#bfdfff;">10.9e2</span></code>
|<samp><span style="border-left:2px solid; background:#bfdfff;">10.9e2</span></samp>
|-
|-
|<code>101</code>
|<samp>101</samp>
|<code><b style="color:#c00;">0</b>101</code>
|<samp><b style="color:#c00;">0</b>101</samp>
|<code><span style="border-left:2px solid;"></span>-1</code>
|<samp><span style="border-left:2px solid;"></span>-1</samp>
|<code>-<b style="color:#c00;">2</b><span style="border-left:2px solid;"></span></code>
|<samp>-<b style="color:#c00;">2</b><span style="border-left:2px solid;"></span></samp>
|<code>0.<span style="border-left:2px solid;"></span><b style="color:#c00;">11</b></code>
|<samp>0.<span style="border-left:2px solid;"></span><b style="color:#c00;">11</b></samp>
|<code><span style="border-left:2px solid; background:#bfdfff;">11.10e3</span></code>
|<samp><span style="border-left:2px solid; background:#bfdfff;">11.10e3</span></samp>
|}
|}


==更新履歴==
==更新履歴==
* 2016/02/28
** (数値を増やす) 正規表現を ([0-8]?)(9*) → ([0-9])(9*) に一部変更。他微調整。
**: 空文字マッチが発生し、処理にムダができていたのを改善。
** 文字数変化量を Document.Text.length の変化から算出するようにして単純化。
** 数値の増減処理を変更(二段階 replace していた処理を一段階に)。
* 2014/06/19
* 2014/06/19
** 非選択時、探索終了位置(bx)の算出方法を変更。
** 非選択時、探索終了位置(bx)の算出方法を変更。
** 数値の増減処理を改修(繰り上げ・繰り下げの場合分けが不要に)。
** 数値の増減処理を変更(繰り上げ・繰り下げの場合分けを不要に)。
* 2014/06/17
* 2014/06/17
** 初版公開。
** 初版公開。


==数値を増やす (インクリメント)==
==数値を増やす(インクリメント)==
<source lang="javascript">
<source lang="javascript">
//■数値を増やす(インクリメント)
//■数値を増やす(インクリメント)
// 2014/06/17-2014/06/19
// 2014/06/17-2016/02/28
//・カーソル付近or選択範囲の10進数値(半角)を 1 増やす。
//・カーソル付近or選択範囲の10進数値(半角)を 1 増やす。
//▲負数(-1)/小数(0.1)/指数(1.2e3)などは考慮しない。
//▲負数(-1)/小数(0.1)/指数(1.2e3)などは対応外。


var sel = Document.Selection;
var Sel = Document.Selection;
var anp = sel.GetAnchorPos();
var gap = Document.Text.length;
var acp = sel.GetActivePos();
var anp = Sel.GetAnchorPos();
var isAcp = (acp<anp)? true: false; //範囲終点が前方にあるか?
var acp = Sel.GetActivePos();
var isSel = !sel.isEmpty; //範囲選択しているか?
var isAcp = (acp<anp); //範囲終点(カーソル)が前方にあるか?
if (!isSel) { //非選択時、文字を探索して範囲選択
var isSel = !Sel.IsEmpty;
  var meP = mePosLogical, meGL = 0;
if (Sel.IsEmpty) { //非選択時、文字を探索して範囲選択
   var px = sel.GetActivePointX(meP);
   var px = Sel.GetActivePointX(mePosLogical);
   var py = sel.GetActivePointY(meP);
   var py = Sel.GetActivePointY(mePosLogical);
   var ln = Document.GetLine(py,meGL);
   var ln = Document.GetLine(py,0);
   var tx = 1 + (ln.slice(0,px-1).match(/[0-9]*$/)).index;
   var tx = 1 + ln.slice(0,px-1).match(/[0-9]*$/).index;
   var bx = tx + (ln.slice(tx-1).match(/[0-9]*/))[0].length;
   var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
   sel.SetActivePoint(meP,bx,py);
   Sel.SetActivePoint(mePosLogical,bx,py);
   sel.SetAnchorPoint(meP,tx,py);
   Sel.SetAnchorPoint(mePosLogical,tx,py);
   isAcp = (px==tx)? true: false; //カーソルが左端(前方)にあるか?
   isAcp = (px===tx); //カーソルが数値の左端(前方)にあるか?
}
}
var carry = 0; //文字数(桁)変動量
Sel.Text = Sel.Text.replace(/([0-9])(9*)(?![0-9])/g,function($0,a,z){
sel.Text = sel.Text.replace(/[0-9]+/g,function(s){
  return (parseInt(a)+1)+ new Array(z.length+1).join("0");
  return s.replace(/([0-8]?)(9*)$/,function(s0,s1,s2){
    if (!s1) carry++; //◆桁上がり
    return (parseInt(s1||0)+1)+(new Array(s2.length+1)).join("0");
  });
});
});
sel.SetAnchorPos(isAcp? anp+carry: anp); //範囲始点を再設定
gap = Document.Text.length - gap; //文字数変化量
sel.SetActivePos(isAcp? acp: acp+carry, isSel); //範囲終点(カーソル位置)を再設定
Sel.SetAnchorPos(anp+(isAcp? gap : 0));
Sel.SetActivePos(acp+(isAcp? 0 : gap), isSel);
</source>
</source>


==数値を減らす (デクリメント)==
==数値を減らす(デクリメント)==
<source lang="javascript">
<source lang="javascript">
//■数値を減らす(デクリメント)
//■数値を減らす(デクリメント)
// 2014/06/17-2014/06/19
// 2014/06/17-2016/02/28
//・カーソル付近or選択範囲の10進数値(半角)を 1 減らす。
//・カーソル付近or選択範囲の10進数値(半角)を 1 減らす。
//▲負数(-1)/小数(0.1)/指数(1.2e3)などは考慮しない。
//▲負数(-1)/小数(0.1)/指数(1.2e3)などは対応外。


var sel = Document.Selection;
var Sel = Document.Selection;
var anp = sel.GetAnchorPos();
var gap = Document.Text.length;
var acp = sel.GetActivePos();
var anp = Sel.GetAnchorPos();
var isAcp = (acp<anp)? true: false; //範囲終点が前方にあるか?
var acp = Sel.GetActivePos();
var isSel = !sel.isEmpty; //範囲選択しているか?
var isAcp = (acp<anp); //範囲終点(カーソル)が前方にあるか?
if (!isSel) { //非選択時、文字を探索して範囲選択
var isSel = !Sel.IsEmpty;
  var meP = mePosLogical, meGL = 0;
if (Sel.IsEmpty) { //非選択時、文字を探索して範囲選択
   var px = sel.GetActivePointX(meP);
   var px = Sel.GetActivePointX(mePosLogical);
   var py = sel.GetActivePointY(meP);
   var py = Sel.GetActivePointY(mePosLogical);
   var ln = Document.GetLine(py,meGL);
   var ln = Document.GetLine(py,0);
   var tx = 1 + (ln.slice(0,px-1).match(/[0-9]*$/)).index;
   var tx = 1 + ln.slice(0,px-1).match(/[0-9]*$/).index;
   var bx = tx + (ln.slice(tx-1).match(/[0-9]*/))[0].length;
   var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
   sel.SetActivePoint(meP,bx,py);
   Sel.SetActivePoint(mePosLogical,bx,py);
   sel.SetAnchorPoint(meP,tx,py);
   Sel.SetAnchorPoint(mePosLogical,tx,py);
   isAcp = (px==tx)? true: false; //カーソルが左端(前方)にあるか?
   isAcp = (px===tx); //カーソルが数値の左端(前方)にあるか?
}
}
var carry = 0; //文字数(桁)変動量
Sel.Text = Sel.Text.replace(/([0-9]?)([1-9])(0*)(?![0-9])/g,function($0,y,a,z){
sel.Text = sel.Text.replace(/[0-9]+/g,function(s){
  //桁下がり      y/a/z  y/a/z
  return s.replace(/([0-9]?)([1-9])(0*)$/,function(s0,s1,s2,s3){
  //◆ する>100 ⇒ /1/00⇒ / /99⇒99
    if (!s1 && s2==1 && s3) {
  //◆しない>1100⇒1/1/00⇒1/0/99⇒1099
      carry--; s1=s2=""; //◆桁下がりする >100 → /1/00→ / /99→99
  return ((!y && a==1 && z)? "" : y+(a-1))+ new Array(z.length+1).join("9");
    } else s2 = s2-1; //◆   しない >1100→1/1/00→1/0/99→1099
    return s1+s2+(new Array(s3.length+1)).join("9");
  });
});
});
sel.SetAnchorPos(isAcp? anp+carry: anp); //範囲始点を再設定
gap = Document.Text.length - gap; //文字数変化量
sel.SetActivePos(isAcp? acp: acp+carry, isSel); //範囲終点(カーソル位置)を再設定
Sel.SetAnchorPos(anp+(isAcp? gap : 0));
Sel.SetActivePos(acp+(isAcp? 0 : gap), isSel);
</source>
</source>


==位取り対応==
==位取り対応==
<source lang="javascript">
<source lang="javascript">
   var bx = tx + (ln.slice(tx-1).match(/[0-9]*/))[0].length;
   var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
 ↓
 ↓
   var bx = (px!=tx)? px: tx + (ln.slice(tx-1).match(/[0-9]*/))[0].length;
   var bx = (px!==tx)? px : tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
</source>
</source>
* マクロの中盤(17行目)を上記のように書き換えると、カーソル左側を基準に増減するようになります。<br>※カーソルが数字の左端にある場合/範囲選択時は、通常どおり増減します。
* マクロの中盤(17行目)を上記のように書き換えると、カーソル左側を基準に増減するようになります。<br>※カーソルが数字の左端にある場合/範囲選択時は、通常どおり増減します。
133行目: 135行目:
! ※左端 !! 千の位 !! 百の位 !! 十の位 !! 一の位 !! ※範囲選択時
! ※左端 !! 千の位 !! 百の位 !! 十の位 !! 一の位 !! ※範囲選択時
|-
|-
|<code><span style="border-left:2px solid;"></span><b style="color:#c00;">999</b></code>
|<samp><span style="border-left:2px solid;"></span><b style="color:#c00;">999</b></samp>
|<code><b style="color:#c00;">0</b><span style="border-left:2px solid;"></span>000</code>
|<samp><b style="color:#c00;">0</b><span style="border-left:2px solid;"></span>000</samp>
|<code><b style="color:#c00;">9</b><span style="border-left:2px solid;"></span>00</code>
|<samp><b style="color:#c00;">9</b><span style="border-left:2px solid;"></span>00</samp>
|<code><b style="color:#c00;">99</b><span style="border-left:2px solid;"></span>0</code>
|<samp><b style="color:#c00;">99</b><span style="border-left:2px solid;"></span>0</samp>
|<code><b style="color:#c00;">999</b><span style="border-left:2px solid;"></span></code>
|<samp><b style="color:#c00;">999</b><span style="border-left:2px solid;"></span></samp>
|<code>9<span style="border-right:2px solid; background:#bfdfff;">99,99</span>9</code>
|<samp>9<span style="border-right:2px solid; background:#bfdfff;">99,99</span>9</samp>
|-
|-
|<code><span style="border-left:2px solid;"></span><b style="color:#c00;">1000</b></code>
|<samp><span style="border-left:2px solid;"></span><b style="color:#c00;">1000</b></samp>
|<code><b style="color:#c00;">1</b><span style="border-left:2px solid;"></span>000</code>
|<samp><b style="color:#c00;">1</b><span style="border-left:2px solid;"></span>000</samp>
|<code><b style="color:#c00;">10</b><span style="border-left:2px solid;"></span>00</code>
|<samp><b style="color:#c00;">10</b><span style="border-left:2px solid;"></span>00</samp>
|<code><b style="color:#c00;">100</b><span style="border-left:2px solid;"></span>0</code>
|<samp><b style="color:#c00;">100</b><span style="border-left:2px solid;"></span>0</samp>
|<code><b style="color:#c00;">1000</b><span style="border-left:2px solid;"></span></code>
|<samp><b style="color:#c00;">1000</b><span style="border-left:2px solid;"></span></samp>
|<code>9<span style="border-right:2px solid; background:#bfdfff;">100,100</span>9</code>
|<samp>9<span style="border-right:2px solid; background:#bfdfff;">100,100</span>9</samp>
|-
|-
|<code><span style="border-left:2px solid;"></span><b style="color:#c00;">1001</b></code>
|<samp><span style="border-left:2px solid;"></span><b style="color:#c00;">1001</b></samp>
|<code><b style="color:#c00;">2</b><span style="border-left:2px solid;"></span>000</code>
|<samp><b style="color:#c00;">2</b><span style="border-left:2px solid;"></span>000</samp>
|<code><b style="color:#c00;">11</b><span style="border-left:2px solid;"></span>00</code>
|<samp><b style="color:#c00;">11</b><span style="border-left:2px solid;"></span>00</samp>
|<code><b style="color:#c00;">101</b><span style="border-left:2px solid;"></span>0</code>
|<samp><b style="color:#c00;">101</b><span style="border-left:2px solid;"></span>0</samp>
|<code><b style="color:#c00;">1001</b><span style="border-left:2px solid;"></span></code>
|<samp><b style="color:#c00;">1001</b><span style="border-left:2px solid;"></span></samp>
|<code>9<span style="border-right:2px solid; background:#bfdfff;">101,101</span>9</code>
|<samp>9<span style="border-right:2px solid; background:#bfdfff;">101,101</span>9</samp>
|}
|}

2016年2月28日 (日) 12:07時点における版

カーソル付近or選択範囲に半角数字列があれば 1 増やし/減らします。

  • カーソル位置は、数字の左端・中間・右端どこでもかまいません。
    範囲選択時は、範囲内のみが対象となります。
    ※マクロの仕様上、矩形選択には対応していません。
左端 中間 右端 範囲選択時
元値 999 999 999 999 999,999
増やす 1000 1000 1000 1000 9100,1009
  • 0 埋め (ゼロパディング/ゼロフィル) された数値は桁数を維持して増減します。
  • 負数 (-1)/小数 (0.1)/指数 (1.2e3) などには対応していません。
ゼロなし/あり 負数の例 小数の例 指数の例
99 0099 -1 -0 0.9 9.8e1
100 0100 -1 -1 0.10 10.9e2
101 0101 -1 -2 0.11 11.10e3

更新履歴

  • 2016/02/28
    • (数値を増やす) 正規表現を ([0-8]?)(9*) → ([0-9])(9*) に一部変更。他微調整。
      空文字マッチが発生し、処理にムダができていたのを改善。
    • 文字数変化量を Document.Text.length の変化から算出するようにして単純化。
    • 数値の増減処理を変更(二段階 replace していた処理を一段階に)。
  • 2014/06/19
    • 非選択時、探索終了位置(bx)の算出方法を変更。
    • 数値の増減処理を変更(繰り上げ・繰り下げの場合分けを不要に)。
  • 2014/06/17
    • 初版公開。

数値を増やす(インクリメント)

//■数値を増やす(インクリメント)
// 2014/06/17-2016/02/28
//・カーソル付近or選択範囲の10進数値(半角)を 1 増やす。
//▲負数(-1)/小数(0.1)/指数(1.2e3)などは対応外。

var Sel = Document.Selection;
var gap = Document.Text.length;
var anp = Sel.GetAnchorPos();
var acp = Sel.GetActivePos();
var isAcp = (acp<anp); //範囲終点(カーソル)が前方にあるか?
var isSel = !Sel.IsEmpty;
if (Sel.IsEmpty) { //非選択時、文字を探索して範囲選択
  var px = Sel.GetActivePointX(mePosLogical);
  var py = Sel.GetActivePointY(mePosLogical);
  var ln = Document.GetLine(py,0);
  var tx = 1 + ln.slice(0,px-1).match(/[0-9]*$/).index;
  var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
  Sel.SetActivePoint(mePosLogical,bx,py);
  Sel.SetAnchorPoint(mePosLogical,tx,py);
  isAcp = (px===tx); //カーソルが数値の左端(前方)にあるか?
}
Sel.Text = Sel.Text.replace(/([0-9])(9*)(?![0-9])/g,function($0,a,z){
  return (parseInt(a)+1)+ new Array(z.length+1).join("0");
});
gap = Document.Text.length - gap; //文字数変化量
Sel.SetAnchorPos(anp+(isAcp? gap : 0));
Sel.SetActivePos(acp+(isAcp? 0 : gap), isSel);

数値を減らす(デクリメント)

//■数値を減らす(デクリメント)
// 2014/06/17-2016/02/28
//・カーソル付近or選択範囲の10進数値(半角)を 1 減らす。
//▲負数(-1)/小数(0.1)/指数(1.2e3)などは対応外。

var Sel = Document.Selection;
var gap = Document.Text.length;
var anp = Sel.GetAnchorPos();
var acp = Sel.GetActivePos();
var isAcp = (acp<anp); //範囲終点(カーソル)が前方にあるか?
var isSel = !Sel.IsEmpty;
if (Sel.IsEmpty) { //非選択時、文字を探索して範囲選択
  var px = Sel.GetActivePointX(mePosLogical);
  var py = Sel.GetActivePointY(mePosLogical);
  var ln = Document.GetLine(py,0);
  var tx = 1 + ln.slice(0,px-1).match(/[0-9]*$/).index;
  var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
  Sel.SetActivePoint(mePosLogical,bx,py);
  Sel.SetAnchorPoint(mePosLogical,tx,py);
  isAcp = (px===tx); //カーソルが数値の左端(前方)にあるか?
}
Sel.Text = Sel.Text.replace(/([0-9]?)([1-9])(0*)(?![0-9])/g,function($0,y,a,z){
  //桁下がり      y/a/z  y/a/z
  //◆ する>100 ⇒ /1/00⇒ / /99⇒99
  //◆しない>1100⇒1/1/00⇒1/0/99⇒1099
  return ((!y && a==1 && z)? "" : y+(a-1))+ new Array(z.length+1).join("9");
});
gap = Document.Text.length - gap; //文字数変化量
Sel.SetAnchorPos(anp+(isAcp? gap : 0));
Sel.SetActivePos(acp+(isAcp? 0 : gap), isSel);

位取り対応

  var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
 
  var bx = (px!==tx)? px : tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
  • マクロの中盤(17行目)を上記のように書き換えると、カーソル左側を基準に増減するようになります。
    ※カーソルが数字の左端にある場合/範囲選択時は、通常どおり増減します。
※左端 千の位 百の位 十の位 一の位 ※範囲選択時
999 0000 900 990 999 999,999
1000 1000 1000 1000 1000 9100,1009
1001 2000 1100 1010 1001 9101,1019
スポンサーリンク