「数値を増減」の版間の差分
細 更新履歴の書式を調整 |
マクロ更新。例示を<code>→<samp>に変更 |
||
| 1行目: | 1行目: | ||
<div style="float:right">__TOC__</div> | |||
カーソル付近or選択範囲に半角数字列があれば 1 増やし/減らします。 | カーソル付近or選択範囲に半角数字列があれば 1 増やし/減らします。 | ||
* カーソル位置は、数字の左端・中間・右端どこでもかまいません。<br> | * カーソル位置は、数字の左端・中間・右端どこでもかまいません。<br>範囲選択時は、範囲内のみが対象となります。<br><b style="color:#c00;">※マクロの仕様上、矩形選択には対応していません。</b> | ||
:{|class="wikitable" style="text-align:center;" | :{|class="wikitable" style="text-align:center;" | ||
! !! 左端 !! colspan="2"|中間 !! 右端 !! 範囲選択時 | ! !! 左端 !!colspan="2"|中間 !! 右端 !! 範囲選択時 | ||
|- | |- | ||
! 元値 | ! 元値 | ||
|< | |<samp><span style="border-right:2px solid;"></span>999</samp> | ||
|< | |<samp>9<span style="border-right:2px solid;"></span>99</samp> | ||
|< | |<samp>99<span style="border-right:2px solid;"></span>9</samp> | ||
|< | |<samp>999<span style="border-right:2px solid;"></span></samp> | ||
|< | |<samp>9<span style="border-right:2px solid; background:#bfdfff;">99,99</span>9</samp> | ||
|- | |- | ||
! 増やす | ! 増やす | ||
|< | |<samp><span style="border-right:2px solid;"></span>1000</samp> | ||
|< | |<samp>10<span style="border-right:2px solid;"></span>00</samp> | ||
|< | |<samp>100<span style="border-right:2px solid;"></span>0</samp> | ||
|< | |<samp>1000<span style="border-right:2px solid;"></span></samp> | ||
|< | |<samp>9<span style="border-right:2px solid; background:#bfdfff;">100,100</span>9</samp> | ||
|} | |} | ||
* | * 0 埋め (ゼロパディング/ゼロフィル) された数値は桁数を維持して増減します。 | ||
* 負数 (-1)/小数 (0.1)/指数 (1.2e3) などには対応していません。 | |||
:{|class="wikitable" style="text-align:center;" | :{|class="wikitable" style="text-align:center;" | ||
! ゼロなし !! | !colspan="2"|ゼロなし/あり !!colspan="2"|負数の例 !! 小数の例 !! 指数の例 | ||
|- | |- | ||
|< | |<samp>99</samp> | ||
|< | |<samp><b style="color:#c00;">00</b>99</samp> | ||
|< | |<samp><span style="border-left:2px solid;"></span>-1</samp> | ||
|< | |<samp>-<b style="color:#c00;">0</b><span style="border-left:2px solid;"></span></samp> | ||
|< | |<samp>0.<span style="border-left:2px solid;"></span><b style="color:#c00;">9</b></samp> | ||
|< | |<samp><span style="border-left:2px solid; background:#bfdfff;">9.8e1</span></samp> | ||
|- | |- | ||
|< | |<samp>100</samp> | ||
|< | |<samp><b style="color:#c00;">0</b>100</samp> | ||
|< | |<samp><span style="border-left:2px solid;"></span>-1</samp> | ||
|< | |<samp>-<b style="color:#c00;">1</b><span style="border-left:2px solid;"></span></samp> | ||
|< | |<samp>0.<span style="border-left:2px solid;"></span><b style="color:#c00;">10</b></samp> | ||
|< | |<samp><span style="border-left:2px solid; background:#bfdfff;">10.9e2</span></samp> | ||
|- | |- | ||
|< | |<samp>101</samp> | ||
|< | |<samp><b style="color:#c00;">0</b>101</samp> | ||
|< | |<samp><span style="border-left:2px solid;"></span>-1</samp> | ||
|< | |<samp>-<b style="color:#c00;">2</b><span style="border-left:2px solid;"></span></samp> | ||
|< | |<samp>0.<span style="border-left:2px solid;"></span><b style="color:#c00;">11</b></samp> | ||
|< | |<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/17-2016/02/28 | ||
//・カーソル付近or選択範囲の10進数値(半角)を 1 増やす。 | //・カーソル付近or選択範囲の10進数値(半角)を 1 増やす。 | ||
//▲負数(-1)/小数(0.1)/指数(1.2e3) | //▲負数(-1)/小数(0.1)/指数(1.2e3)などは対応外。 | ||
var | var Sel = Document.Selection; | ||
var anp = | var gap = Document.Text.length; | ||
var acp = | var anp = Sel.GetAnchorPos(); | ||
var isAcp = (acp<anp) | var acp = Sel.GetActivePos(); | ||
var isSel = ! | var isAcp = (acp<anp); //範囲終点(カーソル)が前方にあるか? | ||
if ( | var isSel = !Sel.IsEmpty; | ||
if (Sel.IsEmpty) { //非選択時、文字を探索して範囲選択 | |||
var px = | var px = Sel.GetActivePointX(mePosLogical); | ||
var py = | var py = Sel.GetActivePointY(mePosLogical); | ||
var ln = Document.GetLine(py, | var ln = Document.GetLine(py,0); | ||
var tx = 1 + | var tx = 1 + ln.slice(0,px-1).match(/[0-9]*$/).index; | ||
var bx = tx + | 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) | 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); | |||
</source> | </source> | ||
==数値を減らす (デクリメント)== | ==数値を減らす(デクリメント)== | ||
<source lang="javascript"> | <source lang="javascript"> | ||
//■数値を減らす(デクリメント) | //■数値を減らす(デクリメント) | ||
// 2014/06/17- | // 2014/06/17-2016/02/28 | ||
//・カーソル付近or選択範囲の10進数値(半角)を 1 減らす。 | //・カーソル付近or選択範囲の10進数値(半角)を 1 減らす。 | ||
//▲負数(-1)/小数(0.1)/指数(1.2e3) | //▲負数(-1)/小数(0.1)/指数(1.2e3)などは対応外。 | ||
var | var Sel = Document.Selection; | ||
var anp = | var gap = Document.Text.length; | ||
var acp = | var anp = Sel.GetAnchorPos(); | ||
var isAcp = (acp<anp) | var acp = Sel.GetActivePos(); | ||
var isSel = ! | var isAcp = (acp<anp); //範囲終点(カーソル)が前方にあるか? | ||
if ( | var isSel = !Sel.IsEmpty; | ||
if (Sel.IsEmpty) { //非選択時、文字を探索して範囲選択 | |||
var px = | var px = Sel.GetActivePointX(mePosLogical); | ||
var py = | var py = Sel.GetActivePointY(mePosLogical); | ||
var ln = Document.GetLine(py, | var ln = Document.GetLine(py,0); | ||
var tx = 1 + | var tx = 1 + ln.slice(0,px-1).match(/[0-9]*$/).index; | ||
var bx = tx + | 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) | 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); | |||
</source> | </source> | ||
==位取り対応== | ==位取り対応== | ||
<source lang="javascript"> | <source lang="javascript"> | ||
var bx = tx + | var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length; | ||
↓ | ↓ | ||
var bx = (px!=tx)? px: tx + | var bx = (px!==tx)? px : tx + ln.slice(tx-1).match(/[0-9]*/)[0].length; | ||
</source> | </source> | ||
* マクロの中盤(17行目)を上記のように書き換えると、カーソル左側を基準に増減するようになります。<br>※カーソルが数字の左端にある場合/範囲選択時は、通常どおり増減します。 | * マクロの中盤(17行目)を上記のように書き換えると、カーソル左側を基準に増減するようになります。<br>※カーソルが数字の左端にある場合/範囲選択時は、通常どおり増減します。 | ||
| 133行目: | 135行目: | ||
! ※左端 !! 千の位 !! 百の位 !! 十の位 !! 一の位 !! ※範囲選択時 | ! ※左端 !! 千の位 !! 百の位 !! 十の位 !! 一の位 !! ※範囲選択時 | ||
|- | |- | ||
|< | |<samp><span style="border-left:2px solid;"></span><b style="color:#c00;">999</b></samp> | ||
|< | |<samp><b style="color:#c00;">0</b><span style="border-left:2px solid;"></span>000</samp> | ||
|< | |<samp><b style="color:#c00;">9</b><span style="border-left:2px solid;"></span>00</samp> | ||
|< | |<samp><b style="color:#c00;">99</b><span style="border-left:2px solid;"></span>0</samp> | ||
|< | |<samp><b style="color:#c00;">999</b><span style="border-left:2px solid;"></span></samp> | ||
|< | |<samp>9<span style="border-right:2px solid; background:#bfdfff;">99,99</span>9</samp> | ||
|- | |- | ||
|< | |<samp><span style="border-left:2px solid;"></span><b style="color:#c00;">1000</b></samp> | ||
|< | |<samp><b style="color:#c00;">1</b><span style="border-left:2px solid;"></span>000</samp> | ||
|< | |<samp><b style="color:#c00;">10</b><span style="border-left:2px solid;"></span>00</samp> | ||
|< | |<samp><b style="color:#c00;">100</b><span style="border-left:2px solid;"></span>0</samp> | ||
|< | |<samp><b style="color:#c00;">1000</b><span style="border-left:2px solid;"></span></samp> | ||
|< | |<samp>9<span style="border-right:2px solid; background:#bfdfff;">100,100</span>9</samp> | ||
|- | |- | ||
|< | |<samp><span style="border-left:2px solid;"></span><b style="color:#c00;">1001</b></samp> | ||
|< | |<samp><b style="color:#c00;">2</b><span style="border-left:2px solid;"></span>000</samp> | ||
|< | |<samp><b style="color:#c00;">11</b><span style="border-left:2px solid;"></span>00</samp> | ||
|< | |<samp><b style="color:#c00;">101</b><span style="border-left:2px solid;"></span>0</samp> | ||
|< | |<samp><b style="color:#c00;">1001</b><span style="border-left:2px solid;"></span></samp> | ||
|< | |<samp>9<span style="border-right:2px solid; background:#bfdfff;">101,101</span>9</samp> | ||
|} | |} | ||
スポンサーリンク