LoginSignup
28
27

More than 5 years have passed since last update.

JavaScriptで正規表現(数字操作編)

Last updated at Posted at 2015-03-08

正規表現で文字列の置き換えを纏めてみました。

あまり自身ないんで、「おかしいよ」「こうした方がいいんじゃない」っていうのがあったらコメント下さい :smile:

なお、簡単なテストは通していますがすべてを網羅しているわけではありませんので、ご使用になる際にはご自身で十分検証の上ご利用下さい :bangbang:

/**
 * 文字列を整数にして返す(parseInt)
 *
 * 全角の数字は半角にする
 * 全角ハイフン、全角ダッシュ、全角マイナス記号、長音符は半角ハイフンに変換
 * 先頭のマイナス以外のハイフンは削除
 *
 * 「abcd -ー123かー456」→「-123456」
 * 「abc123456def」→「123456」
 * 「A0000123456」→「123456」
 * 「A0000123.456」→「123」
 * 「A0-000123.456」→「123」
 * 「A123-00123.456」→「12300123」
 * 「A-00000123456」→「-123456」
 *
 * @param {String} str 変換したい文字列
 */
var toInt = function (str) {
    str = str
            .replace(/[0-9.]/g, function (s) {
                return String.fromCharCode(s.charCodeAt(0) - 65248);
            })
            .replace(/[‐-―ー]/g, '-')
            .replace(/[^\-\d\.]/g, '')
            .replace(/(?!^\-)[^\d\.]/g, '');
    return parseInt(str, 10);
};
/**
 * 文字列を浮動小数点にして返す(parseFloat)
 *
 * 全角の数字は半角にする
 * 全角ハイフン、全角ダッシュ、全角マイナス記号、長音符は半角ハイフンに変換
 * 先頭のマイナス以外のハイフンは削除
 * 数字以外の文字は削除
 * 
 * 「abcd -ー123かー4.56」→「-1234.56」
 * 「abc123456def」→「123456」
 * 「12.34.56」→「12.34」
 * 「A0000123456」→「123456」
 * 「A0000123.456」→「123.456」
 * 「A0-000123.456」→「123.456」
 * 「A123-00123.456」→「12300123.456」
 * 「A-00000123456」→「-123456」
 * 
 * @param {String} str 変換したい文字列
 */
var toFloat = function (str) {
    str = str
            .replace(/[0-9.]/g, function (s) {
                return String.fromCharCode(s.charCodeAt(0) - 65248);
            })
            .replace(/[‐-―ー]/g, '-')
            .replace(/[^\-\d\.]/g, '')
            .replace(/(?!^\-)[^\d\.]/g, '');
    return parseFloat(str);
};
/**
 * 数字(文字列)に変換して返す
 *
 * 全角の数字は半角にする
 * 全角ハイフン、全角ダッシュ、全角マイナス記号、長音符は半角ハイフンに変換
 * 先頭のマイナス以外のハイフンは削除
 * 数字以外の文字は削除
 * parseFloatを通したものを小数点以下numで切り捨て
 * NaNの時は0
 *
 * Number.prototype.toFixed()は小数点以下を近似値で表現する為
 * 
 * 引数numが指定なし、もしくは0の時
 * 「abcd -ー123かー4.56」→「-1234.56」
 * 「abc123456def」→「123456」
 * 「12.34.56」→「12.34」
 * 「A0000123456」→「123456」
 * 「A0000123.456」→「123.456」
 * 「A0-000123.456」→「123.456」
 * 「A123-00123.456」→「12300123.456」
 * 「A-00000123456」→「-123456」
 * 
 * 引数numが1の時
 * 「abcd -ー123かー4.56」→「-1234.5」
 * 「abc123456def」→「123456.0」
 * 「12.34.56」→「12.3」
 * 「A0000123456」→「123456.0」
 * 「A0000123.456」→「123.4」
 * 「A0-000123.456」→「123.4」
 * 「A123-00123.456」→「12300123.4」
 * 「A-00000123456」→「-123456.0」
 * 
 * 引数numが3の時
 * 「abcd -ー123かー4.56」→「-1234.560」
 * 「abc123456def」→「123456.000」
 * 「12.34.56」→「12.340」
 * 「A0000123456」→「123456.000」
 * 「A0000123.456」→「123.456」
 * 「A0-000123.456」→「123.456」
 * 「A123-00123.456」→「12300123.456」
 * 「A-00000123456」→「-123456.000」
 * 
 * @param {String} str 変換したい文字列
 * @param {Number} num 小数点以下の桁数(デフォルトは0「整数」、マイナスは無視)
 * @param {Boolean} useMinus マイナスを削除するかどうか falseの時のみマイナスを削除
 */
var numString = function (str, num, useMinus) {
    num = parseInt(num, 10);
    num = isNaN(num) ? 0 : num;

    // 一旦floatに変換
    str = str
            .replace(/[0-9.]/g, function (s) {
                return String.fromCharCode(s.charCodeAt(0) - 65248);
            })
            .replace(/[‐-―ー]/g, '-')
            .replace(/[^\-\d\.]/g, '')
            .replace(/(?!^\-)[^\d\.]/g, '');
    str = parseFloat(str);
    if (str < 0 && useMinus === false) {
        str *= -1;
    }
    var split = str.toString().split('.');
    var dec = '';
    if (num > 0) {
        if (split.length > 1) {
            dec = '.' + (split[1] + new Array(num + 1).join('0')).slice(0, num);
        } else {
            dec = '.' + new Array(num + 1).join('0').slice(0, num);
        }
    }
    return split[0] + dec;
};
/**
 * 数字の桁区切り
 * 
 * 「12345678」→「12,345,678」
 * 「12345678.123456」→「12,345,678.123456」
 * 「-1234678」→「-12,345,678」
 * 「12,345,678」→「12,345,678」
 * 「12,345,6789」→「12,345,6,789」(桁数を再計算しているわけではないので注意)
 * 「12345678円」→「12,345,678円」
 * 「-12345円」→「-12,345円」
 *
 * @param {String} str 変換したい文字列
 */
var numFormat = function (str) {
    var split = str.split('.');
    split[0] = split[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
    return split.length === 1 ? split[0] : split[0] + '.' + split[1];
};
/**
 * 桁区切りの数字から区切り文字の削除
 *
 * 「12,345,678」→「12345678」
 *
 */
var removeFigure = function (str) {
    return str.replace(/,/g, '');
};

番外編

/**
 * 文字列を右からnum文字切り出す(num文字に足りない場合はpadで埋める)
 *
 * 引数numの指定なし、もしくは2「123」→「23」
 * 引数numが5「123」→「00123」
 * 引数numが-10 「123」→「23」
 * 引数numが0(変化なし)「123」→「123」
 * 引数numが5、padがa「123」→「aa123」
 * 引数numが10、padがab「123」→「bababab123」
 * 
 * @param {String} str 変換したい文字列
 * @param {Number} num 切り出す文字数(指定なしもしくは0より小さいときは2)
 * @param {String} pad 桁数に足りない場合に左側を埋める文字(デフォルトは0)
 */
var padSlice = function (str, num, pad) {
    num = parseInt(num, 10);
    num = isNaN(num) || num < 0 ? 2 : num;
    pad = pad === undefined ? '0' : pad.toString();
    return (new Array(num + 1).join(pad) + str).slice(num * -1);
};
/**
 * 文字列の左側を桁数numになるまで埋める(numを超える場合は何もしない)
 *
 * 引数numの指定なし、もしくは2「123」→「123」
 * 引数numが5「123」→「00123」
 * 引数numが-10 「123」→「123」
 * 引数numが0「123」→「123」
 * 引数numが5、padがa「123」→「aa123」
 * 引数numが10、padがab「123」→「abababab123」
 * 
 * @param {String} str 変換したい文字列
 * @param {Number} num 文字数(指定なしもしくは0より小さいときは2)
 * @param {String} pad 桁数に足りない場合に左側を埋める文字(デフォルトは0)
 */
var padFill = function (str, num, pad) {
    num = parseInt(num, 10);
    num = isNaN(num) || num < 0 ? 2 : num;
    pad = pad === undefined ? '0' : pad.toString();
    while (str.length < num) {
        str = pad + str;
    }
    return str;
};
28
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
27